在Django中加入两个包含相同外键的表

时间:2014-07-21 04:35:57

标签: mysql sql django

所以我有两个包含主键'User'的模型

class Reviews(models.Model):
    subject_user = models.ForeignKey(User,related_name='reviewed_user')
    actor = models.ForeignKey(User)                         ## irrelavent 
    text = models.TextField()

class Friendship(models.Model):
    head_user = models.ForeignKey(User,related_name='followed')
    tail_user = models.ForeignKey(User)                     ## irrelavent 

现在,我想查找同样位于Friendsip.head_user的用户的所有评论。例如,假设用户'1'用户'3'用户'5'

分别撰写评论
Reviews:
subject_user_id     actor_id     text
3                   1            LoremIpsum1
5                   1            LoremIpsum2

Friendship:
head_user           tail_user
3                   9
8                   9      ### Irrelavent

现在我输出的应该是与'LoremIpsum1'对应的评论对象,即其{subject}也出现在Friendship.head_user中的评论对象。我尝试了以下

reviews = Reviews.objects.all().select_related('friendship__head_user')

但它给了我所有的评论

修改

这是我插入评论的方式:

review, created = Reviews.object.get_or_create(subject_user=target, actor=actor)
review.text = NewReviewText
review.save()

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这应该有效:

heads = (f.head_user for f in Friendship.objects.all())
reviews = Reviews.objects.all().filter("subject_user__in"=heads)

首先,您抓住Friendship中的所有主要用户,然后找到他们的所有评论,这似乎符合您的要求:

  

我想查找同样位于Friendship.head_user

的用户的所有评论

您无法使用select_related的原因是它希望两个模型之间存在明确的关系,在您的情况下,不是。在ReviewFriendship之间没有定义外键,因此在这种情况下,最佳方式可能就是我提出的方法。

然而,在你愤怒地测试这个并做了一些分析以确认你的系统是一个关键的慢点之前,我会听从唐纳德克努特的话:

  

我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。