小编典典

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

sql

所以我有两个包含主键’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_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()

阅读 192

收藏
2021-04-14

共1个答案

小编典典

如果我对您的理解正确,这应该可以:

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

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

我想找到也在该网站上的用户的所有评论 Friendship.head_user

无法使用的原因select_related是,它期望两个模型之间存在显式关系,而在您的情况下
则没有 。在aReview和a之间没有定义外键Friendship,因此在这种情况下,最佳的方法可能就是我提出的方法。

但是,除非您愤怒地测试了这一点并进行了分析以确认这是系统中的关键慢点,否则我会一直听Donald Knuth的话:

我们应该忘记效率低下的问题,例如大约97%的时间:过早的优化是万恶之源。

2021-04-14