以下内容返回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')
但是,如果我删除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')
但是我仍然想对owner_company进行过滤,那我如何得到1个退货?
答案 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。