首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django递归关系

Django递归关系
EN

Stack Overflow用户
提问于 2013-08-16 10:17:29
回答 2查看 4.7K关注 0票数 2

我正在使用Django 1.5,并且正在为一些我认为是非常基本的东西而奋斗。

我有下面的人模型:

代码语言:javascript
复制
class Person(models.Model):
    contact_person = models.ManyToManyField(ContactPerson)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
...

目标是向模型中添加person的partner。我不想让伴侣或人凌驾于他人之上,他们应该是平等的。换句话说,在查找一个人时,他/她的伴侣也应该出现(如果有)。我需要能够增加一次的伴侣,无论是在女人的或在男人的身边(我不想把他们联系两次)。

我搜索了OneToOneFields的文档,但递归OneToOnes似乎不受支持,也就是说,当我尝试时得到一个NameError (“名称'Person‘没有定义”):

代码语言:javascript
复制
partner = models.OneToOneField(Person, blank=true, null=true)

谁能给我指明正确的方向?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-16 12:24:22

试试这个:

代码语言:javascript
复制
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    ...
    partner = models.OneToOneField('self', null=True, blank=True)

    def save(self, checkPartner = True, *args, **kwargs):
        super(Person, self).save()
        if self.partner and checkPartner:
            self.partner.partner = self
            self.partner.save(checkPartner = False)
  • 必须启用合作伙伴字段上的Null true,因为要保存的第一个人将没有任何合作伙伴。
  • 添加了checkPartner参数,这样保存()就不会落入无限循环中
票数 4
EN

Stack Overflow用户

发布于 2013-08-16 10:22:40

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

代码语言:javascript
复制
partner = models.OneToOneField('Person', blank=true, null=true)

或者换一种方式,如果你在同一堂课

代码语言:javascript
复制
partner = models.OneToOneField('self', blank=true, null=true)

在这种情况下,引号就是一切。

代码语言:javascript
复制
def save(self, *args, **kwargs):
    # call to super, we want self.partner to be set
    super(Person, self).save(*args, **kwargs)

    # this is necessary to avoid infinite save loops on partner's save call
    # at this point, you have a partner
    # this won't work if your partner has already a partner
    # but it's easy to go from here
    if not self.partner.partner:
        self.partner.partner = self
        self.partner.save()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18271001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档