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)
При необходимости скорректируйте название столбца.