Как создать псевдоним для первого активного элемента в обратном отношении в моделях 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"""

У меня два вопроса.

  1. Как отфильтровать элементы без содержимого или без активного содержимого.
  2. Могу ли я сделать что-то вроде псевдонима для вызова 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.

Вернуться на верх