Родовые отношения и итерации на объектах в Джанго
У меня есть три модели: "Пост", "Категория" и "Флаг". Я разрешаю пользователям делать флажки для каждого поста, помеченного категорией. Теперь я хочу перечислить все флаги, связанные с постами в определенной категории. Я нашел два способа сделать это с помощью универсального представления ListView:
Первый подход:
Определите общую связь между флагом и категорией, чтобы я мог вызвать что-то вроде: Flag.objects.filter(object__categor=self.category)
Второй подход:
def get_queryset(self):
pk = self.kwargs['pk']
self.category = get_object_or_404(Category, pk=pk)
flags = Flag.objects.all()
qs=[]
for f in flags:
if f.object.category == self.category:
qs.append(f)
return qs
У меня вопрос, какой подход является более эффективным? Я не знаком с родовыми отношениями, но кажется, что это немного тяжело. С другой стороны, запросы ко всем объектам Flag и итерации по ним недешевы.
Models.py
class Flag(models.Model):
flagger = models.ForeignKey(User, related_name='flaggers')
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = GenericForeignKey('content_type', 'object_id')
submit_date = models.DateTimeField(auto_now_add=True)
reason = models.IntegerField(choices=REASON_CHOICES, default=BROKEN_LINK)
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
...
class Base(models.Model):
title = models.CharField(max_length=200)
slug = models.CharField(max_length=200, db_index=True)
category = models.ForeignKey(Category, default=1)
...
class Text(Base):
description = models.TextField(max_length=500)
...
class Image(Base):
image = models.ImageField()
class Post(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
created_at = models.DateTimeField(null=True)
После сохранения каждого из экземпляров Text или Image я создаю модель Post. Таким образом, я могу пометить сообщения или текст, и изображение отдельно.
[также будет полезен любой совет о том, как я могу определить родовое отношение в случае, если я должен его использовать]