DJango join на двух полях

В принципе, у меня есть три модели в django:

Car(models.Model):
   id = models.BigAutoField(primary_key=True)
   company_id = models.ForeignKey(Company, models.DO_NOTHING)
   type_id = models.ForeignKey(Type, models.DO_NOTHING)'

Type(model.Model):
    id = models.BigAutoField(primary_key=True)
    size = models.CharField(max_length=1024, blank=True, null=True)

Vendor(model.Model):
    id = models.BigAutoField(primary_key=True)
    company_id = models.ForeignKey(Company, models.DO_NOTHING)
    type_id = models.ForeignKey(Type, models.DO_NOTHING)
    vendor_priority = models.CharField(max_length=1024, blank=True, null=True)

у меня тоже есть код

my_cars = Car.objects.filter(cars_filter)

Что я хочу сделать, так это присоединить информацию из ventor к my_cars, чтобы я мог получить доступ к информации vendor_priority, мне придется создать присоединение по type_id и company_id, сохранив существующие фильтры. В SQL то, что я хочу сделать, выглядит так:

select * from cars left join vendor on cars.company_id = vendor.company_id 
and cars.type_id = vendor.type_id 
where cars_filter = cars_filter;

Вы можете сделать это следующим образом:

query = Car.objects.filter(cars_filter).annotate(vendor_priority=Subquery(Vendor.objects.filter(company_id=OuterRef('company_id'), type_id=OuterRef('type_id')).values('vendor_priority')[:1])) #ensure only first value is fetched (if any)

При необходимости скорректируйте название столбца.

Вернуться на верх