Django模型引用如循环?

时间:2016-01-15 20:46:19

标签: django postgresql django-models

我想知道如何将django模型像循环引用... ...,

class Family(models.Model): 
   fname = models.CharField(max_length=30,unique=True)
   member_id = models.ForeignKey(Member) 

class Member(models.Model):
   name = model.CharField(max_length=30,unique=True)
   family_id = models.ForeignKey(Family)

这两个Familiy和会员是我的模特。我想要一些循环参考......

主要目标是绑定每个家庭成员。这很好用。但有些查询我只解析家庭表,我想要那个特定家庭的主要成员,我希望每个家庭的家长都意味着我该怎么办?

解释循环引用或任何更好的方法。或者我应该为两者做外键。请帮助解决问题。

3 个答案:

答案 0 :(得分:0)

这不是正确的方法,你不应该在你的模型中有循环引用。如果你想拥有这样的关系,取决于要求:

  1. 如果一个人只能拥有一个家庭,请将家庭作为外键放在Member模型中。

  2. 如果一个人可以有多个家庭,请在member模型中将ManyToMany作为Family字段。

  3. 另外,请勿为您的字段member_idfamily_id命名。 Django模型不仅仅是数据库设计,还有python类代码。请尝试改为使用memberfamily

    温和的建议:请不要在代码块标签中提出您的问题的任何描述。同时尽量使你的措辞尽可能正式(上限)。

    修改

    如果您想获得一个家庭的会员详情,那么在django也很容易:

    # model
    class Family(models.Model): 
       fname = models.CharField(max_length=30,unique=True)
    
    class Member(models.Model):
       name = model.CharField(max_length=30,unique=True)
       family = models.ForeignKey(Family)
    
    # get a family
    family = Family.objects.get(id=1)
    # get all family members
    all_family_members = family.member_set.all()
    

    Django doc关于向后关系。

答案 1 :(得分:0)

使两个模型具有彼此的外键没有问题。您必须为family_head允许空值,因为您无法创建没有系列的成员。

class Family(models.Model): 
   fname = models.CharField()
   family_head = models.ForeignKey(Member, null=True, blank=True, on_delete=models.SET_NULL) 

class Member(models.Model):
   name = model.CharField()
   family = models.ForeignKey(Family)

您现在可以创建一个具有null family_head的族,然后创建该族的成员,然后在检查family_head是否实际上是其中一个家庭成员之后设置family_head。

答案 2 :(得分:0)

Here is the code, The method called circular reference which is worked for me..

in model use function instead of Foreignkey on both tables like below, 
class Family(models.Model): 
   fname = models.CharField()

   def get_member(self):
        return Member.objects.get(family=self,family_head=True) 

class Member(models.Model):
   name = model.CharField()
   family = models.ForeignKey(Family)

and to get the expected value just call this line from your django view or something else. 
print "get member",Family.object.get(id=1).get_member()
#above line will return table object. so if you want certain field use like this, name : Family.object.get(id=1).get_member().name