Как создать псевдоним для первого активного элемента в обратном отношении в моделях Django?
У меня есть модель под названием Item:
class Item(models.Model):
...
Также у меня есть другая модель под названием Content. Она имеет отношение к 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.content, чтобы вернуть активное содержимое элемента, не вызывая проблем с производительностью БД.
Как отфильтровать элементы без содержимого или без активного содержимого.
Вы фильтруете с:
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
.