如何在 Django ORM 中连接反向 ManyToManyField 的属性

问题描述 投票:0回答:1

假设这些是我的模型:

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
的一些属性。例如,我需要帐单 ID 和帐单日期。因此,结果中的每一行都应包含产品的所有属性以及两个附加属性:bill_id 和 bill_date。 Django 是否可以通过使用连接来实现这一点?如果是的话,怎么办?

python sql django django-models
1个回答
0
投票

每个产品仅与一个法案相关或根本不相关。

如果是这种情况,则建模是错误的。然后

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

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

因此,您可以为每个产品访问

my_product.bill
,然后它是一个具有所需数据的
Bill
对象。

© www.soinside.com 2019 - 2024. All rights reserved.