我想知道如何将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和会员是我的模特。我想要一些循环参考......
主要目标是绑定每个家庭成员。这很好用。但有些查询我只解析家庭表,我想要那个特定家庭的主要成员,我希望每个家庭的家长都意味着我该怎么办?
解释循环引用或任何更好的方法。或者我应该为两者做外键。请帮助解决问题。
答案 0 :(得分:0)
这不是正确的方法,你不应该在你的模型中有循环引用。如果你想拥有这样的关系,取决于要求:
如果一个人只能拥有一个家庭,请将家庭作为外键放在Member
模型中。
如果一个人可以有多个家庭,请在member
模型中将ManyToMany
作为Family
字段。
另外,请勿为您的字段member_id
或family_id
命名。 Django模型不仅仅是数据库设计,还有python类代码。请尝试改为使用member
和family
。
温和的建议:请不要在代码块标签中提出您的问题的任何描述。同时尽量使你的措辞尽可能正式(上限)。
修改强>:
如果您想获得一个家庭的会员详情,那么在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