反向查询中检索Django QuerySet匹配字段(related_name)

时间:2019-02-20 20:51:42

标签: python django python-3.x django-models

我为标题道歉...很难一口气解释我的问题。

我正在尝试确定一种通过对象的related_name集合来检索与另一个模型中的字段匹配的一个模型的所有对象的方法。

我的模型示例:

class InvDetail(models.Model):
    sales_order = models.ForeignKey('SalesOrder', on_delete=models.SET_NULL, null=TRUE)
    [...]other invoice related fields[...]

class SalesOrder(models.Model):
    [...]a bunch of sales order specific fields[...]

class SOSeller(models.Model):
    sales_order = models.ForeignKey('SalesOrder', on_delete=models.CASCADE)
    salesperson = models.ForeignKey('UserProfile', on_delete=models.CASCADE)

我要获取的是与SalesOrder对象链接的所有InvDetail对象,这些对象具有一个与特定UserProfile对象链接的SOSeller对象。

在我的情况下,单个销售订单可以附加多个销售人员(例如,在这种情况下,他们都出于佣金目的而获得信用)

现在,我正在遍历所有InvDetails的for循环,(或者实际上是过滤到特定的日期范围,我没有在模型中显示它)。

invdetails = InvDetail.objects.all()

filtered_inds = []

for invdetail in invdetails:
    sellers = invdetail.sales_order.soseller_set.all().values_list('salesperson__user__username', flat=True)

    if name in sellers:
        filtered_inds.append(invdetail)

这为我提供了与特定销售员相关的所有发票的列表,但是它非常缓慢,特别是当它必须迭代的发票数量增加时。

我一直在尝试寻找一种更好的方法来查询数据,例如通过Q或F函数,但是我一直无法找到一种使用它们来获取相同数据的方法...

类似

inv_details = InvDetail.objects.filter(sales_order__soseller_set__contains='tom')

最初,我的模型是经过设置的,因此我只将一个ForeignKey字段链接到每个销售订单中的一个销售员,这很容易收集与销售员关联的所有发票,但是我被要求能够添加其他销售人员,以便多个销售人员可以与任何特定销售相关联...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您已经接近正确的答案,当您基于相关模型创建过滤器时,例如,对于模型,您不应该使用set后缀:

class UserProfile(models.Model):
    username = models.CharField(max_length=200)

class SalesOrder(models.Model):
    pass

class InvDetail(models.Model):
    sales_order = models.ForeignKey('SalesOrder', on_delete=models.SET_NULL, null=True)

class SOSeller(models.Model):
    sales_order = models.ForeignKey('SalesOrder', on_delete=models.CASCADE)
    salesperson = models.ForeignKey('UserProfile', on_delete=models.CASCADE)

查询将是:

InvDetail.objects.filter(
    sales_order__soseller__salesperson__username__contains='tom'
)