我有三个模型,分别称为 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 对象并遍历它们并不便宜。
模型.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 模型。所以我可以分别标记帖子或文本标记和图像标记。
[还有关于如何定义泛型关系的任何提示,以防我应该使用它,将不胜感激]