创建几个递归的m2m关系时出错 [英] Error creating several recursive m2m relationships

查看:128
本文介绍了创建几个递归的m2m关系时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要存储人与人之间的关系。所以我有以下模型

  class Person(models.Model):
name = models.CharField(max_length = 255,blank = True)
parents = models.ManyToManyField('self',through ='PersonRelationship',symmetric = False,blank = True,related_name =person_parents_set)
friends = models.ManyToManyField 'self',through ='PersonRelationship',symmetric = 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空白= True)

当我尝试syncdb我得到这个错误:

 错误:一个或多个模型未验证:
films.person:模型Person通过mo有两个手动定义的m2m关系del PersonRelationship,不允许。请考虑在您的中介模型上使用一个额外的字段。

我想我不能有两个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

而且'得到这个错误,但我已经有一个相关的名称:

  films.personparent:from_person字段的访问者与相关的字段'Person.from_persons'。在from_person的定义中添加一个related_name参数。 
films.personparent:字段'from_person'的反向查询名称与相关字段'Person.from_persons'冲突。在from_person的定义中添加一个related_name参数。
films.personparent:from_person字段的访问者与相关字段Person.from_persons冲突。在from_person的定义中添加一个related_name参数。
films.personparent:字段'from_person'的反向查询名称与相关字段'Person.from_persons'冲突。在from_person的定义中添加一个related_name参数。

任何帮助将不胜感激。

解决方案

我刚刚找到了解决方案,我发布它,以防有人来自谷歌发现同样的问题。



阅读此链接[链接更新到v1.9]:



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



所以我只是将相关名称更改为:

  from_person = model.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)


I need to store the relations between people. So I have the following models

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)

When I try to syncdb I get this error:

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.

I guess I cannot have two m2m relationships trough the same model, so I tried to create a model for each type of relation, to avoid repeating myself I used a abstract model like this:

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

And I'm getting this error, but I already have a 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'.

Any help would be appreciated.

解决方案

I just found the solution, I am posting it in case somebody coming from google had found the same issue.

Read this link [link updated to v1.9]:

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

So I just changed the related name to:

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")

这篇关于创建几个递归的m2m关系时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆