【问题标题】:Why is Conditional Expressions adding new Items to a list view为什么条件表达式将新项目添加到列表视图
【发布时间】:2020-07-02 14:54:47
【问题描述】:

我正在尝试将帖子添加到列表视图,主页列表视图已经有一个项目上下文。

在我的项目中,用户可以添加帖子和添加项目,每个项目都是具有不同模型的不同应用。

所以在我的主页列表视图中,我有我的项目循环,并且在每个项目中,它都显示了与之相关的用户。

我要做的是检查该 item.user 是否有与用户相关的 admin_approved=True 帖子,如果确实存在,则页面中会出现一个按钮显示,链接到包含这些帖子的另一个页面。

因此,如果有零个与用户相关的帖子或可用的帖子但 admin_approved=False还没有 admin_approved=True 按钮不应该出现,但如果有 1 个或多个帖子是 @987654324 @按钮应该会出现。

我试图注释查询集,但问题是当用户有 2 个帖子时,一个已获批准,另一个未获批准,2 个项目出现一个带有按钮,一个没有按钮,并且主页列表中发生重复查看

我曾尝试使用 .distinct() 但它不起作用 项目仍然重复

这是models.py

class Post(models.Model):
    designer = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100, unique=True)
    admin_approved = models.BooleanField(default=False)

这里是观点

from .models import Item
from django.db.models import Case, When, BooleanField, Q

class HomeView(ListView):
    model = Item
    paginate_by = 12
    template_name = "home.html"
    ordering = ['-timestamp']

    def get_queryset(self):
        has_post = Case(
            When(Q(designer__post__isnull=False) & Q(designer__post__admin_approved=True), then=True),
            default=False,
            output_field=BooleanField()
        )
        return super().get_queryset().annotate(has_post=has_post).distinct()

这是模板

{% for item in object_list %}
    {{ item.title }}
    {% if item.has_post %}
        SHOW BUTTON
    {% else %}
        HIDE BUTTON
    {% endif %}
{% endfor %}

这里是物品模型

class Item(models.Model):
    designer = models.ForeignKey(
        User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)

【问题讨论】:

  • 它将为每个designer__post 组合重复相同的Item

标签: python django django-views


【解决方案1】:

它将为每个designer__post 组合重复每个Item,因为您不使用“折叠”功能。

您可以改用Exists subquery [Django-doc]

from django.db.models import Exists, OuterRef

class HomeView(ListView):
    model = Item
    paginate_by = 12
    template_name = "home.html"
    ordering = ['-timestamp']

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).annotate(
            has_post=Exists(
                Post.objects.filter(
                    designer_id=OuterRef('designer_id'),
                    admin_approved=True
                )
            )
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多