1

(これは、「すでに回答があるかもしれない質問」リストに基づいた一般的な質問のようですが、どれも私を助けませんでした。)

マルチテーブル継承を持つモデルがいくつかあります。

管理者 (およびその後のフロントエンド アプリ) では、基本クラス内のすべてのもののリストが必要であり、それらがどの子 (または孫) クラスに属しているかを識別することもできます。

これには継承マネージャーを使用しようとしています。これまでのところ運がありません。

class Entry(models.Model):
    name = models.CharField(max_length=200)
    description = models.TextField(max_length=500)
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    slug = models.SlugField(unique=True)
    objects = InheritanceManager()

    def get_queryset(self, request):
        qs = self.model.objects.get_queryset()
        ordering = self.get_ordering(request)
        if ordering:
            qs = qs.order_by(*ordering)
        return qs

    def __str__ (self):
        return self.name + " entry"


class Person(Entity):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

    def __str__ (self):
        return self.name + " Person"

文字列「person」と「Entry」の追加は単なるテストです。

エンティティのリストはEntry、(実際には) 人物であっても を表示するだけです。

Entry.__str__最終的なサブクラスを表示するものに書き込めるようにしたいと思います。そうすれば、エントリのリストを取得して次のように表示できます。

Bob (Person)
ABC Co. (Organization)
Great Expectations (Book)
4

1 に答える 1

2

私は同じ問題を抱えていて、何らかの方法でハックを見つけました。しかし、それは決してきれいだとは感じませんでした。私はdjango-polymorphicを使用することになりました...

Project モデルから継承したモデルを保存すると...

Project.objects.create(topic="Department Party") ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner") ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

...すべてのプロジェクトを取得したい場合、サブクラス化されたモデルが返されます!

Project.objects.all() [ <Project: id 1, topic "Department Party">, <ArtProject: id 2, topic "Painting with Tim", artist "T. Turner">, <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

通常の Django を使用して、基本クラスのオブジェクトを取得しますが、これが必要になることはめったにありません。

Project.objects.all() [ <Project: id 1, topic "Department Party">, <Project: id 2, topic "Painting with Tim">, <Project: id 3, topic "Swallow Aerodynamics"> ]

それが役立つことを願っています!

于 2016-01-21T15:04:21.627 に答える