通用关系与迭代Django中的对象

时间:2015-11-17 18:58:44

标签: django django-queryset django-contenttypes generic-relations

我有三个名为Post,Category和Flag的模型。 我允许用户在每个帖子上标记一个类别。现在我要列出与某个类别的帖子相关的所有标志。 我已经找到了两种使用ListView通用视图的方法:

第一种方法:
定义Flag和Category之间的通用关系,以便我可以调用类似: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模型。因此,我可以将标记的帖子标记或标记为文本,并单独标记图像。

[关于我如何定义通用关系的任何提示,如果我应该使用它,将不胜感激]

0 个答案:

没有答案