Django M2M通过int“自我”。表,如何获取相关项目

时间:2011-08-16 06:12:13

标签: django many-to-many

我正试图在我的一个模型中建立一些M2M关系。 Django让我把related_name参数放到一些字段中,然后把它们放进去。但是,我现在对如何获取相关项目感到困惑。这是我的模型简化。

class Post(models.Model):
    # other fields
    relevancy = models.ManyToManyField("self",through="Traffic",symmetrical=False,related_name="relevant",blank=True)

    #some method definitions

class Traffic(models.Model):
    tfrom = models.ForeignKey(Post,related_name="tfrom")
    tto = models.ForeignKey(Post,related_name="tto")
    count = models.PositiveIntegerField(default=0)

这是一种用户倾向分析,并向其他用户工具提供建议。我感到困惑的部分是我得到相关帖子的部分。例如,当我选择发布时,如何获得一组帖子,该帖子来自该帖子的流量,或者一组帖子被提交到该帖子等。这是我之前发布的related question

PS:英语不是我的主要语言,如果我的问题很难理解,那就很抱歉。

1 个答案:

答案 0 :(得分:1)

这取决于中间模型定义。中间模型的第一个FK定义了“主要”访问,因此

a_post.relevancy.all()

是从Post到的流量的所有a_post个实例的集合。

a_post.relevant.all()

是所有Post个实例的集合,其流量a_post

你应该考虑你的命名惯例,这很令人困惑。

中的某些内容
links = models.ManyToManyField("self",
             through="Traffic",
             symmetrical=False,
             related_name="referrers",
             blank=True)

关键在于django sorce代码:

https://code.djangoproject.com/browser/django/trunk/django/db/models/fields/related.py#L1059

                    # If this is an m2m-intermediate to self,
                    # the first foreign key you find will be
                    # the source column. Keep searching for
                    # the second foreign key.

所以你有那个

s1 = set(my_post.relevancy.all())
s2 = set(t.tto for t in my_post.tfrom.select_related('tto'))
assert not s1.symmetric_difference(s2)

在更简单的SQL中,描述符p.relevancy将获取ID所在的所有Post个实例

select traffic.tto_id where traffic.tfrom_id = my_post_id