我有一个名为 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"""
我有两个问题。
如何过滤掉没有任何内容或没有任何活动内容的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
。