我有令牌模型:
class Token(models.Model):
name = models.CharField()
...
我有一个短语短语,其令牌为fk
class Phrase(models.Model):
token = models.ForeignKey(Token, on_delete=models.SET_NULL, null=True,
related_name = "phrases")
frequency = models.IntegerField()
我需要执行一个复杂的查询 结果,我希望具有通过某些参数计数过滤的令牌名称和短语的对象列表,如下所示:
[{'name':'token1', 'phrases_with_freq_greater_than_100': 50},{'name':'token2', 'phrases_with_freq_greater_than_100': 250}]
我该怎么做? 我知道我可以使用注释功能来做到这一点,但不确定如何做到。 到目前为止,我只是通过遍历令牌对象来做到这一点,但这是无效的。
答案 0 :(得分:0)
tokens.annotate(phrases_with_freq_greater_than_100=Count(Q(phrases__freq__gte=100))).values('name','phrases_with_freq_greater_than_100')
答案 1 :(得分:0)
是的,您可以使用注释功能在令牌模型上进行查询,以便生成所需的列“ phrases_with_freq_greater_than_100”。以下查询将返回带有上一列(变量)的查询对象:
tokens = tokens.annotate(phrases_with_freq_greater_than_100=Count(phrases__frequency__gt=100))
现在,您可以迭代“令牌”查询对象,或者要获取字典的直接列表,请使用上述查询中的values函数:
tokens.annotate(phrases_with_freq_greater_than_100=Count(phrases__frequency__gt=100)).values('name','phrases_with_freq_greater_than_100')