如何在我的应用程序中获取用户之间的关系?

时间:2013-09-17 04:15:59

标签: django algorithm model

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

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

 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

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

使用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语句而且它真的很长,而且非常愚蠢,所以请帮我解决这个问题。

1 个答案:

答案 0 :(得分: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()

[你可能只是用key来做,我真的不记得django那么好了]

所以现在每次向DB添加成员时都需要填充UserToRelations表。你计算那里的关系。

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