为了账号安全,请及时绑定邮箱和手机立即绑定

为什么条件表达式将新项目添加到列表视图

为什么条件表达式将新项目添加到列表视图

慕姐8265434 2023-02-15 17:15:15
我正在尝试将帖子添加到列表视图,主页列表视图已经有一个项目上下文。在我的项目中,用户可以添加帖子和添加项目,每个都是具有不同模型的不同应用程序。所以在我的主页列表视图中,我循环显示了我的项目,并且在每个项目中,它都显示了与之相关的用户。我想做的是检查此 item.user 是否有admin_approved=True与用户相关的帖子,如果确实存在,则页面中会显示一个按钮显示,链接到包含这些帖子的另一个页面。因此,如果有零个与用户相关的帖子或可用的帖子,但 admin_approved=False按钮不应 admin_approved=True出现,但如果有 1 个或多个帖子,则admin_approved=True按钮应该出现。我试图注释查询集,但问题是当用户有 2 个帖子时,一个已获批准,另一个未获批准,2 个项目出现一个带有按钮,一个没有按钮,并且在主页列表视图中发生重复我曾尝试使用 .distinct() 但它没有用,项目仍然重复这是模型.pyclass 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 Itemfrom django.db.models import Case, When, BooleanField, Qclass 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)
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

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

您可以改用子Exists查询 [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

                )

            )

        )


查看完整回答
反对 回复 2023-02-15
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信