python - 如何修复 Django 中的 'The QuerySet value for an exact lookup must be limited to one result using slicing.' 错误

标签 python django django-views

我正在尝试返回 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/

相关文章:

python - 如何使用 ansible 和 module portinstall 安装 FreeBSD port?

python - 从 python 中的 sys.stderr 读取

Django - 遗留数据库和 'id' 字段的问题

Django 查询设置为从数据库中获取数据?

使用 SQLAlchemy + postgresql 更新 Python 数据库

python - 使用python在mysql中动态创建表

python - Python 脚本运行方式的差异

django - Django 中的应用程序设计

django - 序列化程序嵌套关系无法正常工作

python - NumPy 调整大小方法