我正在尝试返回 Django View 中过滤后的 qweryset 的计数。如何实现这一目标,同时避免“精确查找的 QuerySet 值必须限制为使用切片的一个结果”。错误?
我尝试使用 len() 但仍然遇到相同的错误。
这是我的代码:
型号
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=200)
author = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
body = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE,
blank=True, null=True)
read_time = models.CharField(max_length=256, null=True, blank=True)
count_visits = models.IntegerField(default=0)
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES,
default='published')
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:blog_post', args=[self.slug])
def get_body_as_markdown(self):
return mark_safe(markdown(self.body, safe_mode='escape'))
class PostView(models.Model):
post = models.ForeignKey(Post, on_delete=models.SET_NULL, null=True,
related_name='postviews')
ip = models.CharField(max_length=50)
http_host = models.CharField(max_length=256, null=True, blank=True)
http_referrer = models.CharField(max_length=256, null=True, blank=True)
http_user_agent = models.CharField(max_length=256, null=True, blank=True)
remote_host = models.CharField(max_length=256, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.ip
浏览次数:
class PostDetailView(DetailView):
model = Post
template_name = 'blog/post.html'
context_object_name = 'post'
def get(self, request, *args, **kwargs):
self.slug = get_object_or_404(Post, slug=self.kwargs['slug'])
p = Post.objects.filter(slug=self.slug)
count_visits = None
unique_views = set()
if self.request.user.is_authenticated:
post_views = PostView.objects.filter(post=p)
count_visits = post_views.count()
for post_view in post_views:
unique_views.add(post_view.ip)
else:
post_view = PostView(ip=request.META.get('REMOTE_ADDR', ''),
http_host=request.META.get('HTTP_HOST', ''),
http_referrer=request.META.get('HTTP_REFERER',''),
http_user_agent=request.META.get('HTTP_USER_AGENT',''),
remote_host=request.META.get('REMOTE_HOST', ''))
post_view.save()
c = {
'count_visits': count_visits,
'unique_views': unique_views,
}
return render(request, self.template_name, c)
模板:
<span>
{% if user.is_authenticated %}
<br>
{{ count_visits }} views, {{ unique_views|length }} unique views.
{% endif %}
</span>
我希望输出显示模板中的 View 数量,但我收到“精确查找的 QuerySet 值必须限制为使用切片的一个结果”。错误。
非常感谢!
最佳答案
改变这个
p = Post.objects.filter(slug=self.slug)
至此
p = Post.objects.filter(slug=self.slug)[0]
错误:
filter
返回一个查询集,即使只有一个元素匹配。
PostView.objects.filter(post=p)
失败,因为它期望 post 是一个对象而不是查询集。
更新:
self.slug
不会被初始化,因为实例变量只能在__init__
内部声明。
您只需删除 self
部分即可将slug
标记为局部变量
slug = get_object_or_404(Post, slug=self.kwargs['slug'])
p = Post.objects.filter(slug=slug)
关于python - 如何修复 Django 中的 'The QuerySet value for an exact lookup must be limited to one result using slicing.' 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284938/