1

重複の可能性:
Django モデルのポリモーフィズム

グループへの外部キーを持つ Constraint 抽象基本モデルがあります。いくつかのモデルは Constraint を継承して、さまざまな方法で動作します。これが私が持っているものの(非常に単純化された)バージョンです:

class Constraint(models.Model):
    group = models.ForeignKey(Group)

    def get_constraint_type(self):
        return 'Base'

    class meta:
        abstract = True

class UserConstraint(Constraint):
    user = models.ForeignKey(User)

    def get_constraint_type(self):
        return 'User'

class ProjectConstraint(Constraint):
    project = models.ForeignKey(Project)

    def get_constraint_type(self):
        return 'Project'

グループを指定すると、それを指す制約モデル インスタンスのリストを作成できる必要があります。

たとえば、もしそうなら

group = ...
constraints = group.constraint_set.all()
for c in constraints:
    print c.get_constrait_type()

現在、「ユーザー」、「プロジェクト」、「ユーザー」などではなく、「ベース」を何度も出力します。

本当にハックな解決策は、基本クラスで次のような関数を実装することです。

def get_child(self):
    try:
        return self.usercontraint
    except UserConstraint.DoesNotExist:
        pass
    try:
        return self.projectcontraint
    except ProjectConstraint.DoesNotExist:
        pass
    # etc...

しかし、それは本当にひどいようです。より良い解決策はありますか?

4

1 に答える 1

2

SO、あなたは Group モデルのインスタンスを持っていて、UserConstraint または ProjectConstraint に関連するクエリセットを持ちたいということですか?

related_nameForeignKey フィールドの適切なパラメーターを使用してこれを達成するための解決策があります。詳細はdocsで入手できます。

Constraint モデルを次のように定義する必要があると思います。

class Constraint(models.Model):
    group = models.ForeignKey(Group, related_name="%(class)s_set")

    def get_constraint_type(self):
        return 'Base'

    class Meta:
        abstract = True

次のように使用します。

user_constraints = group.userconstraint_set.all()
project_constraints = group.projectconstraint_set.all()

編集:

related_nameをからに変更しまし"%(class)s""%(class)s_set"。以前の値は機能していませんでした。その理由はわかりません。

于 2012-09-18T19:50:01.357 に答える