我有可以与图像和位置相关联的标签。
以下是模型:
LOCATIONS = (
('US', 'USA'),
('UK', 'United Kingdom'),
('FR', 'France'),
)
class Location(models.Model):
location = models.CharField(choices=LOCATIONS)
class Image(models.Model):
image = models.ImageField(verbose_name='Image')
class Tag(models.Model):
tag = models.CharField(max_length=150, unique=True)
class Tag_Item(models.Model):
tag = models.ForeignKey(Tag, on_delete=models.CASCADE)
location = models.ForeignKey(Location, null=True, blank=True, default=None)
image = models.ForeignKey(Image, null=True, blank=True, default=None)
created_at = models.DateTimeField(auto_now_add=True)
我想写一个查询,意味着为美国选择五个最常用的标签。
我正在思考SQL中的以下几行:
但是我无法弄清楚如何在Django ORM中传输它。
你能帮我解决一下如何编写那种复杂的关系查询吗?
答案 0 :(得分:1)
您需要做一些事情来开始这样的查询:
annotate()
,将用于订购查询集。order_by()
将用于检索表格的特定列。GROUP BY ... COUNT
的说明:
values()
您可以简化所描述的查询:
from django.db.models import Count
usa_tags = Tag_Item.objects.filter(location__location='US')
.values('tag__tag__id')
.annotate(my_count=Count('tag__tag__id')
.order_by('my_count')
这将返回一个有序词典,第一个条目是顶部标签第二个条目是第二个使用的标签等:
tag_id | my_count
-------|---------
5 | 101
1 | 53
... | ...
现在您可以从该词典中检索五个顶级标签。