【问题标题】:QuerySet results being duplicated when chaining queries链接查询时 QuerySet 结果重复
【发布时间】:2019-02-18 04:01:19
【问题描述】:

所以我试图将查询链接在一起。这就是我正在做的事情

 queryset_list = modelEmployee.objects.filter(stars__lte=3)
 A = len(queryset_list) #A=2
 queryset_list = queryset_list.filter(skills__skill_description__in=skill_filter)
 A = len(queryset_list) #A=4

因此,根据上述情况,我想得到两个结果,但我得到了四个。似乎第一个查询的结果在第二个查询中被复制,因此结果为 4。关于为什么结果被复制以及如何解决这个问题的任何建议?我原本希望只得到两个项目,因为它通过了两个过滤器。

这是模型

class modelEmployee(models.Model):
    user                = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    skills              = models.ManyToManyField(modelSkill, blank=True)
    location            = models.PointField(srid=4326,max_length=40, blank=True,null=True)

【问题讨论】:

  • 能否请您添加modelEmployee 定义和skill_filter 是什么。
  • 刚刚更新了帖子
  • as Skills 是一个manytomany 字段员工实例,开始__lte 比 3(即 2)都具有这些技能。这有点像 [ , , , ] 你只想要用户 ID 吗?
  • 我想知道的是为什么我会重复。假设第一个查询的结果是 Adam 和 John。在运行第二个查询之后,亚当和约翰再次被添加到查询集中。为什么他们已经存在时又被添加了
  • 如果 Adman 和 John 有多个技能他们会添加多次,最好改变过滤的顺序。

标签: django django-orm


【解决方案1】:

如果您对ManyToManyField 进行查询,Django 将执行INNER JOIN,这意味着连接的每一侧的每个项目都会有一行。如果您想获得独特的结果,请使用distinct()

queryset_list = queryset_list.filter(
    skills__skill_description__in=skill_filter
).distinct()

有关示例,请参阅此article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-28
    • 2013-06-07
    • 2015-10-29
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多