为什么django中的.filter()会返回重复的对象?

时间:2016-07-19 07:43:38

标签: django

我已经按照django教程进入了tutorial05

我试图不像教程所说的那样显示空轮询,所以我添加了这样的过滤条件:

class IndexView(generic.ListView):
    ...
    def get_queryset(self):
        return Question.objects.filter(
            pub_date__lte=timezone.now(),
            choice__isnull=False
        ).order_by('-pub_date')[:5]

但是这返回了两个完全相同的对象。

我认为 choice__isnull = False 导致了这个问题,但不确定。

4 个答案:

答案 0 :(得分:9)

choice__isnull会导致问题。它导致加入choice表格(除了questions而没有choices),就像这样:

SELECT question.*
  FROM question
  JOIN choice
    ON question.id = choice.question_id
 WHERE question.pub_date < NOW()

您可以检查query的{​​{1}}属性以确定。因此,如果您有一个QuerySet有两个question,那么您将获得choices两次。在这种情况下,您需要使用distinct()方法:question

答案 1 :(得分:1)

只需在 ORM 末尾使用 .distinct()

答案 2 :(得分:0)

聚会晚了一点,但我认为它可以帮助其他人查找相同的问题。 与其将choice__isnull=Falsefilter()方法一起使用,不如将exclude() ... def get_queryset(self): return Question.objects.filter(pub_date__lte=timezone.now()).exclude(choice__isnull=True).order_by('-pub_date')[:5] 一起使用,以排除任何没有选择的问题。因此您的代码应如下所示:

question

通过这种方式,它将仅返回choice_isnull=True的一个实例。不过,请务必使用def _build(self, **kwargs) -> bool: """**kwargs should contain the same values expected by the docker.from_env().api.build() method""" print("building...") try: response = [line for line in docker.from_env().api.build(decode=True, **kwargs)] if not response: print("Error! Failed to get a response from docker client") return False for result in response: for (key, value) in result.items(): if isinstance(value, str): print(value) return True except (docker_error.BuildError, docker_error.APIError) as error: print("Error! {}") return False

答案 3 :(得分:-1)

因为您创建了两个具有相同属性的对象。如果要确保唯一性,则应在clean中添加验证,并在标识符字段中添加唯一索引。

filter返回符合条件的所有对象外,如果您只希望返回一个项目,则应使用get。如果找到少于或多于1个项目,get会引发异常。