【发布时间】:2016-11-01 21:59:11
【问题描述】:
我在 Django 中有以下模型(为简洁起见):
class DistinctWord(models.Model):
...
class Word(models.Model):
distinct_word = models.ForeignKey('DistinctWord', related_name='words')
...
class UserWord(models.Model):
distinct_word = models.ForeignKey(DistinctWord, related_name='user_words')
...
在单词中:DistinctWord 是相互派生的单词的根(例如,silly、sillier、silliest),而 UserWord 是用户的字典。因此,当用户将一个单词添加到他的字典中时,他实际上添加了根单词(以及所有相关的单词)。所以,当他要求查看/研究他字典中的单词时,我必须带一个实际的单词(例如第一个单词)。
也就是说,对于给定的 UserWords 查询集(例如 uw),我想检索与该查询集中每一行相关的第一个 Word(最好是一次或几次访问数据库,而不是每次访问一次)排)。这将是原始 sql 中的简单连接、分组和限制 1,但我无法在 Django 中完全理解它。
【问题讨论】:
-
这看起来像 Django annotating with a first element of a related queryset 的副本,尽管那里没有好的答案。也看看this blog post。基本上,这并不容易。
-
@solarissmoke 请在下面查看我的答案,我认为它比您提到的博客中的要好。它甚至不会部分回退到原始 sql。
-
在您撰写此评论时可能没有一个好的答案,但stackoverflow.com/a/60636238/188 是实现此目的的最佳方式(尽管可能需要的远不止这些)。 schinckel.net/2019/07/30/subquery-and-subclasses 可能是更好的资源(如果我自己这么说的话)。
标签: django django-models