0

この質問に続いて...

私のブログには2つの主要なモデルがArticleありLink、とは両方とものサブクラスですPost。少し単純化すると、次のようになります。

class Post(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()
    post_date = models.DateField(db_index=True, auto_now_add=True)

class Article(Post):
    feature_image = models.FileField(upload_to='feature_images')

class Link(Post):
    link = models.URLField(verify_exists=True)

記事とリンクの両方を収集したいので、私の見解では、実行Post.objects.order_by('post_date')してプレストし、リスト全体を取得しますが、にあるフィールドのみを使用しますPost。インスタンスでリンクを使用したい場合、使用Linkできません。

私は主キーを持っているので、次のようなことをしてLink.objects.get(pk=item.pk)設定できるはずですが、これがaLinkか。かを知る必要がありArticleます。

親モデルにプロパティを作成post_typeし、子からの正しいモデル名でそれに書き込むことはできますか?

4

1 に答える 1

0

最後に、Post のカスタム マネージャーを作成することで、これをまったく別の方法で解決しました。

class PostManager(models.Manager):
    def __get_final(self, pk):
        for k in Post.__subclasses__():
            if k.objects.filter(pk=pk).exists():
                return k.objects.get(pk=pk)
        return None

    def __subclass_queryset(self, qs):
        collection = []
        for item in qs:
            collection.append(self.__get_final(item.pk))
        return collection

    def all(self):
        return self.__subclass_queryset(super(PostManager, self).all())

ここPost.objects.all()で (または、マネージャーに追加したその他の QuerySet 操作などorder_by)、特定のフィールドの完全なセットを含むすべてのオブジェクトのリストを取得します。(次に、サブクラスのマネージャーをリセットするので、ルーチン操作のためのこれらの余分なクエリに悩まされることはありません。)

于 2012-06-02T18:12:45.107 に答える