我已经按照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 导致了这个问题,但不确定。
答案 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=False
与filter()
方法一起使用,不如将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
会引发异常。