Как объединить атрибуты обратного поля 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 вместе с Products:

results = Product.objects.filter(
    bill__customer=customer, sku__icontains=search_str
).select_related('bill')

Таким образом, вы можете для каждого продукта получить доступ к my_product.bill, который затем является Bill объектом с необходимыми данными.

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