我正试图在我的一个模型中建立一些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:英语不是我的主要语言,如果我的问题很难理解,那就很抱歉。
答案 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