所以我有两个包含主键’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” 分别撰写了一条评论 *
Friendsip.head_user
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_user也存在于中的评论对象Friendship.head_user。我尝试了以下
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()
如果我对您的理解正确,这应该可以:
heads = (f.head_user for f in Friendship.objects.all()) reviews = Reviews.objects.all().filter("subject_user__in"=heads)
首先,您抓住Friendships中的所有主要用户,然后找到他们的所有评论,这些评论似乎符合您的要求:
Friendship
我想找到也在该网站上的用户的所有评论 Friendship.head_user
无法使用的原因select_related是,它期望两个模型之间存在显式关系,而在您的情况下 则没有 。在aReview和a之间没有定义外键Friendship,因此在这种情况下,最佳的方法可能就是我提出的方法。
select_related
Review
但是,除非您愤怒地测试了这一点并进行了分析以确认这是系统中的关键慢点,否则我会一直听Donald Knuth的话:
我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。