0

假设有家庭,每个家庭成员都可以登录我的应用程序,当用户登录时,我想显示他与其他家庭成员之间的关系,而不仅仅是家庭成员的姓名。

真正的挑战是根据登录用户的关系是动态的,例如:

 A is the father of B
 C is the wife of B
 B and C have a child D

如果 D 登录,则关系将是

 A = granddad
 B = father
 C = mother
 D = me

但如果 A 登录,则关系将是

 A = me
 B = son
 C = daughter in law
 D = grandson

这个例子相当简单,但现实世界的情况要复杂得多,比如兄弟姐妹、阿姨、叔叔等。

我正在使用 django,这就是我的模型的定义方式:

class UserProfile(models.Model):
   user = models.OneToOneField(User)
   family = models.ManyToManyField(FamilyProfile,related_name='family_members')
   realname = models.CharField(max_length=100)
   date_of_birth = models.DateField(
    'user born date', null=True, blank=True)
   is_male = models.BooleanField(default=False) # True male

   relation_level = models.IntegerField(null=False,blank=False,default=9999)
   is_foreign = models.BooleanField(default=False) # True foreign
   is_host = models.BooleanField(default=False)  # Ture host,
   objects = profileManager()

因为关系船是动态的,我不能把它保存到数据库中,而是使用profileManager计算关系船并将其添加到成员:member.relation_name,但这对我来说太复杂了,现在我我使用了很多 if...else 语句,它真的很长,而且很愚蠢,所以请帮我解决这个问题。

4

1 回答 1

1

如果您从数据库的角度来看,正确的做法是在 UserProfile 模型中添加一个“id”字段,并添加另一个类,例如:

类关系(models.Model):relation_id = models.IntegerField()relation_name = models.CharField()

这将充满关系(如:(1,“儿子”),(2,“父亲”)等)(您可能还需要为男性和女性制作一个字符串。这就是这里最不有趣的一点。

创建此关系列表后,您需要将关系分配给用户,因此我们制作另一个模型:

类 UserToRelations(models.Model): user_a_id = models.IntegerField() user_b_id = models.IntegerField() relation_id = models.IntegerField()

[你可能只是用keys 来做,我真的不太记得 django]

因此,现在您需要在UserToRelations每次将成员添加到数据库时填充表。你计算那里的关系。

选择部分是您看到此利润的地方。每次成员登录时,您只需从UserToRelations模型中获取所有相关行,然后将它们呈现出来。

于 2013-09-17T05:16:42.663 回答