繁体   English   中英

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

[英]Retrieving Django QuerySet matching field in reverse query (related_name)

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

我正在尝试确定一种方法,该方法通过对象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字段链接到每个销售订单中的一个销售员,并且很容易收集与该销售员相关的所有发票,但是我被要求能够添加其他销售员,因此多个销售人员可以与任何特定销售相关联...

有任何想法吗?

您接近正确的答案,当您基于相关模型创建过滤器时,例如,对于模型,您不应使用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'
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM