0

Post、Category、Flag という 3 つのモデルがあります。カテゴリでタグ付けされた各投稿にユーザーがフラグを立てられるようにします。ここで、特定のカテゴリの投稿に関連するすべてのフラグを一覧表示したいと考えています。ListViewジェネリックビューを使用してそれを行う2つの方法を見つけました:

最初のアプローチ:
Flag と Category の間の一般的な関係を定義して、次のようなものを呼び出せるようにします。Flag.objects.filter(object__categor=self.category)

2 番目のアプローチ:

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 モデルを作成します。したがって、投稿にフラグを立てるか、テキストにフラグを立てて画像にフラグを立てることができます。

[また、一般的な関係を使用する必要がある場合に備えて、どのように一般的な関係を定義できるかについてのヒントもいただければ幸いです]

4

0 に答える 0