Как объединить атрибуты обратного поля ManyToManyField в Django ORM
Предположим, что это мои модели:
class Product(models.Model):
sku = models.CharField(unique=True) # Something like RXT00887
class Bill(models.Model):
customer = models.ForeignKey(Customer)
products = models.ManyToManyField(Product)
date = models.DateTimeField()
Каждый Product
связан только с одним Bill
или не связан вообще.
Я работаю над функцией, которая требует от меня поиска по Product
, которые были куплены определенным клиентом. Я добиваюсь этого с помощью:
bills = Bill.objects.filter(customer=customer)
results = Product.objects.filter(bill__in=bills, sku__icontains=search_str)
Однако мне также необходимо иметь некоторые атрибуты Bill
каждого продукта в результатах. Например, мне нужны идентификатор счета и дата счета. Таким образом, каждая строка в результатах должна содержать все атрибуты продукта вместе с двумя дополнительными атрибутами: bill_id и bill_date. Можно ли добиться этого в Django с помощью джойнов? Если да, то как?
Каждый продукт относится только к одному счету или не относится вообще.
Если это так, то моделирование неверно. Тогда Product
нужно ForeignKey
перевести в Bill
, например:
class Product(models.Model):
sku = models.CharField(unique=True) # Something like RXT00887
bill = models.ForeignKey(
'Bill', related_name='products', on_delete=models.PROTECT
)
class Bill(models.Model):
customer = models.ForeignKey(Customer)
# products = models.ManyToManyField(Product)
date = models.DateTimeField()
Затем вы можете выбрать Bill
вместе с Product
s:
results = Product.objects.filter(
bill__customer=customer, sku__icontains=search_str
).select_related('bill')
Таким образом, вы можете для каждого продукта получить доступ к my_product.bill
, который затем является Bill
объектом с необходимыми данными.