当前位置: 首页 > 面试题库 >

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

朱岳
2023-03-14
问题内容

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

问题答案:

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

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%的时间:过早的优化是万恶之源。



 类似资料:
  • 在一个表中有两列可以是来自同一表的外键,这样可以吗? 例如: 我有一个“address”表,表中有列: id,street,city_id,state,country(或id,street,city_id,state_id,state_id) 我有一个'states'表,保存状态和国家:id、name、level 那么我可以把states_id放在地址表的state和country中吗(如上面的括

  • 问题内容: 我想要两个相同模型的外键: 我收到如下错误: 字段“ example1”的访问器与相关字段“ Example.test_set”冲突。在“ example1”的定义中添加一个related_name参数。 问题答案: 尝试使用:

  • 问题内容: 我正在为Java中的ERP系统进行定制。在我的定制中,我想使用Apache POI 3.10.1。因此,我集成了jars poi-3.10.1-20140818.jar和poi-ooxml-3.10.1-20140818.jar。 但是,这些jar包含几个类,这些类已经包含在ERP系统的核心代码中,但是有所不同。 如果核心ERP类覆盖POI类,则定制将引发运行时异常。如果POI类覆盖核

  • 下面我有两个箱子。 案例1和案例2之间的区别在于案例2具有在中,但案例1在中具有。 问题是关于案例2的输出:为什么包含两个不同的值,一个是,另一个是字符串“B”?

  • 问题内容: 语境 我正在为该类编写一个简单的 JUnit 测试。 阿可以从静态工厂方法,需要一个可变参数的创建 字符串 。 在的存在期间的任何时间,客户端可以检查它通过在的形式创建的参数 列表 ,通过方法。 换句话说,a 既记住并公开了使之成为现实的参数列表。有关此合同的更多详细信息: 的顺序将与为对象创建选择的顺序相同 允许重复的后续 String 组件并按顺序保留 行为未定义(其他代码保证没有

  • 的顺序将与为创建对象选择的顺序相同 允许重复的后续字符串组件并按顺序保留 未定义的行为(其他代码保证没有进入工厂) 在对象实例化之后,没有任何方法可以更改组件列表 我正在编写一个简单的测试,该测试从字符串列表创建并检查它是否可以通过返回相同的列表。我立即这样做,但这应该发生在一个现实的代码路径的远处。 这里是我的尝试: null null