假设有家人,每个家庭成员都可以登录我的应用程序,当用户登录时,我想显示他和其他家庭成员之间的关系,而不仅仅是家庭成员名称。
真正的挑战是根据登录用户的关系是动态的,例如:
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语句而且它真的很长,而且非常愚蠢,所以请帮我解决这个问题。
答案 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
模型中获取所有相关行,然后您只需显示它们。