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

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


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


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


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


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


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


我曾尝试使用 .distinct() 但它没有用,项目仍然重复


这是模型.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)


慕姐8265434
浏览 112回答 1
1回答

翻过高山走不出你

Item它会为每个组合重复每个designer__post,因为您不使用“折叠”功能。您可以改用子Exists查询 [Django-doc]:from django.db.models import Exists, OuterRefclass 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                )            )        )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python