【问题标题】:django model for list of objects' relations to each other?对象相互关系列表的django模型?
【发布时间】:2012-07-21 03:45:50
【问题描述】:

我有一个社会集团对象。

在每个社会集团对象中,我都有一个朋友对象列表。

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

在这里我被卡住了。如何正确定义我的模型,以便我可以查询任何朋友对象以提取他们的共享关系对象?

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

我目前的方法是让关系对象看起来像下面发布的那样。我必须在我的代码中添加逻辑以防止重复的关系对象......但是这个

 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 设计模式。关于正确描述此问题或如何解决此问题的任何建议?

【问题讨论】:

    标签: python django design-patterns


    【解决方案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()
    

    【讨论】:

    • Relationship.objects.get(friend_0=me, friend_1=my_friend) 中,args 的顺序表明我必须正确地获得关系的顺序。我怎么知道将 args 放在哪个顺序以获得一个关系 btwn 任意的friend_x和friend_y?选择一种策略,比如按朋友姓名的字母顺序排列? ...
    • 好问题。问题在于与表can't be symmetrical 的递归多对多关系。您可以通过在建立友谊时自动创建 两个 Relationship 实例来解决这个问题,每个方向一个。
    • 是的,但它是一种共享关系——只是一对之间的关​​系。我想我会使用朋友的可排序键(字母或日期)来始终恢复正确的关系并创建正确的关系。
    猜你喜欢
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2017-05-26
    • 1970-01-01
    相关资源
    最近更新 更多