3

継承マネージャーに django-model-utils を使用しています。一度に 1 つのサブクラスのみの結果を取得したい。

manager.py

from model_utils.managers import InheritanceManager
class PostManager(InheritanceManager):
    pass

models.py

from .managers import PostManager
class Post(models.Model):
    title = models.CharField(max_length=20)
    text = models.TextField()
    objects = PostManager()


class ImagePost(Post, models.Model):
    source = models.URLField()
    image = models.ImageField(upload_to="images/%Y/%m/%d")


class VideoPost(Post, models.Model):
    source = models.URLField()

画像タイプのみの結果を返したい。このようなより単純なクエリを書くことによって。

Post.objects.filter(type='image').select_subclasses()

私が試したこと:

if type == 'image':
    Post.objects.filter(imagepost__isnull=False).select_subclasses()

これは機能しますが、一種のアンチパターンです。すべてのコンテンツ タイプのビューに条件を記述したくありません。

モデルでプロパティを定義したり、マネージャー メソッドに変換したりするより良い方法はありますか? または私は何かを逃していますか?

4

1 に答える 1

2

select_subclassesクラスをメソッドに渡そうとしましたか?

Post.objects.select_subclasses(ImagePost)

この機能に関するドキュメントを確認してください。

編集:

私は質問を誤解しましたが、OPはPostwith タイプのみを望んでいるようImagePostです。実行すると、すべてがフェッチされ、タイプを持つオブジェクトがインスタンスselect_subclasses(ImagePost)に変換されます。解決策は次のように簡単にする必要があります。ImagePostImagePost

image_posts = ImagePost.objects.all()
于 2016-05-09T14:43:57.540 に答える