所以我有两个包含主键'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()
答案 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
的原因是它希望两个模型之间存在明确的关系,在您的情况下,不是。在Review
和Friendship
之间没有定义外键,因此在这种情况下,最佳方式可能就是我提出的方法。
然而,在你愤怒地测试这个并做了一些分析以确认你的系统是一个关键的慢点之前,我会听从唐纳德克努特的话:
我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。