日期范围预取给出多个条目,而不是1

时间:2018-12-20 11:00:01

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

以下内容返回3个对象,但这应该只有1个。由于只有1个InsiderTrading对象具有这些过滤器,但是有3个所有者。

quarter_trading_2018q1 = InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).prefetch_related('owners')

enter image description here

但是,如果我删除owner_company过滤器,它将返回1(正确的行为)

quarter_trading_2018q1 = InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).prefetch_related('owners')

enter image description here

但是我仍然想对owner_company进行过滤,那我如何得到1个退货?

2 个答案:

答案 0 :(得分:1)

您应该添加一个distinct()

InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
).distinct().prefetch_related('owners')

答案 1 :(得分:0)

如果distinct有效:这意味着该查询的结果为

InsiderTrading.objects.filter(
    issuer=company_issuer.pk,
    owners__company=company.pk,
    transaction_date__range=["2018-01-01", "2018-03-30"]
)

有多个结果而不是一个。

Django文档状态

  

select_related()“遵循”外键关系,选择   在执行查询时,还会有其他相关对象数据。

     

prefetch_related()对每个关系进行单独的查找,并且   在Python中执行“加入”。

我想改用select_related。 检查https://stackoverflow.com/a/31237071/4117381

另一种解决方案是使用group_by owner_id。