如何在 Django 模型中为反向关系中的第一个活动项创建别名?

问题描述 投票:0回答:1

我有一个名为 Item 的模型:

class Item(models.Model):
    ...

我还有另一个模型,称为内容。它与 Item 和 ChoiceField 相关,用于选择内容是否处于活动状态:

class Content(models.Model):
    item = ForeignKey(Item related_name=)
    is_active = BooleanField(default=False)
    content = TextField()

    def save(self, *args, **kwargs):
       """There's a logic to make sure every item has only one content"""

我有两个问题。

  1. 如何过滤掉没有任何内容或没有任何活动内容的Item。
  2. 我可以做一些类似别名的事情来调用 item.content 来返回项目的活动内容,而不会导致数据库性能问题。
python django django-models django-queryset
1个回答
0
投票

如何过滤掉没有任何内容或没有任何活动内容的Item。

您的过滤条件为:

from django.db.models import Q

Content.objects.filter(~Q(content=''), is_active=True)

我可以做一些类似别名的事情来调用 item.content 来返回项目的活动内容,而不会导致数据库性能问题。

鉴于相关名称如下:

class Content(models.Model):
    item = ForeignKey(Item, on_delete=models.PROTECT, related_name='contents')

您可以使用以下方法将这些

Content
预取到
contents

from django.db.models import Prefetch, Q

Item.objects.prefetch_related(
    Prefetch('contents', Content.objects.filter(~Q(content=''), is_active=True))
)

对于这些

Item
,它将把
.contents.all()
设置为相关的
Content
,其中
content
不为空,并且
is_active
True

© www.soinside.com 2019 - 2024. All rights reserved.