0

人と人との関係を保存する必要があります。だから私は次のモデルを持っています

class Person(models.Model):
    name = models.CharField(max_length=255, blank=True)
    parents = models.ManyToManyField('self', through='PersonRelationship', symmetrical=False, blank=True, related_name="person_parents_set")
    friends = models.ManyToManyField('self', through='PersonRelationship', symmetrical=False, blank=True, related_name="person_friends_set") 

class PersonRelationship(models.Model):
    from_person = models.ForeignKey(Person, related_name="from_persons")
    to_person = models.ForeignKey(Person, related_name="to_persons")
    relation_start = models.DateField(blank=True)
    relation_end = models.DateField(blank=True)

syncdb を実行しようとすると、次のエラーが発生します。

Error: One or more models did not validate:
films.person: The model Person has two manually-defined m2m relations through the model PersonRelationship, which is not permitted. Please consider using an extra field on your intermediary model instead.

同じモデルで 2 つの m2m 関係を作成することはできないと思います。そのため、繰り返しを避けるために、関係のタイプごとにモデルを作成しようとしました。次のような抽象モデルを使用しました。

class PersonRelationship(models.Model):
    from_person = models.ForeignKey(Person, related_name="from_persons")
    to_person = models.ForeignKey(Person, related_name="to_persons")
    relation_start = models.DateField(blank=True)
    relation_end = models.DateField(blank=True)

    class Meta:
        abstract = True

class PersonParent(PersonRelationship):
    pass 

class PersonFriend(PersonRelationship):
    pass

このエラーが発生していますが、既に related_name を持っています:

films.personparent: Accessor for field 'from_person' clashes with related field     'Person.from_persons'. Add a related_name argument to the definition for 'from_person'.
films.personparent: Reverse query name for field 'from_person' clashes with related field    'Person.from_persons'. Add a related_name argument to the definition for 'from_person'.
films.personparent: Accessor for field 'from_person' clashes with related field 'Person.from_persons'. Add a related_name argument to the definition for 'from_person'.
films.personparent: Reverse query name for field 'from_person' clashes with related field 'Person.from_persons'. Add a related_name argument to the definition for 'from_person'.

どんな助けでも大歓迎です。

4

1 に答える 1

0

解決策を見つけたところです。Google から来た誰かが同じ問題を見つけた場合に備えて投稿しています。

このリンクを読んでください [v1.9 に更新されたリンク]:

https://docs.djangoproject.com/en/1.9/topics/db/models/#be-careful-with-related-name

そのため、関連する名前を次のように変更しました。

from_person = models.ForeignKey(Person, related_name="%(app_label)s_%(class)s_from_persons")
to_person = models.ForeignKey(Person, related_name="%(app_label)s_%(class)s_to_persons")
于 2013-02-19T01:59:27.657 に答える