django模型列出了对象之间的关系?

时间:2012-07-22 19:55:14

标签: python django design-patterns

我有一个社会集团对象。

在每个社交群体对象中,我都有一个朋友对象列表。

每个朋友 - 对象都有一个关系对象(充满了有趣的事实,比如他们遇到的时候)与对方的朋友。

我在这里被困住了。如何正确定义模型以便我可以查询任何朋友对象以获取其共享关系对象?

我没有看到这只是用bidirectional model like this answer解决,因为我正在处理一个庞大且不断增长的朋友对象列表(在链接到解决方案中,他们创建了两个不同的模型,例如friend_a和friend_b)。

我目前的方法是将Relationship对象看作下面发布的内容。我必须在我的代码中添加逻辑以防止重复的关系对象......但是这个

 class Relationship(models.Model):
     social_clique = models.ForeignKey( Social_Clique )
     friend_0 = models.ManyToManyField( Friend, related_name='friend_0' )
     friend_1 = models.ManyToManyField( Friend, related_name='friend_1' )

我感觉我错过了正确的关键字谷歌找到这个问题的ORM设计模式。有关此问题的正确描述或如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

任何friend_x字段都不是ManyToManys是没有意义的。朋友之间的关系是ManyToMany,但Relationship本身就是多对多关系中的中间模型(因此得名)。所以friend_字段应该是ForeignKeys,然后你还使用Relationship作为through模型从Friend到自己定义一个ManyToMany字段:

class Relationship(models.Model):
    social_clique = models.ForeignKey(Social_Clique)
    friend_0 = models.ForeignKey(Friend, related_name='friend_0')
    friend_1 = models.ForeignKey(Friend, related_name='friend_1')

class Friend(models.Model):
    ... other fields ...
    friends = models.ManyToManyField('Friend', through=Relationship)

现在很容易从两个朋友(memy_friend)转到他们的共享关系:

Relationship.objects.get(friend_0=me, friend_1=my_friend)

me.friend_0.filter(friend1=my_friend)

等。你仍然可以得到我所有的朋友:

me.friends.all()