我有可以与图像和位置关联的标签。
- 标签是唯一的。
- 图片和位置可以有多个标签。
- Tag_Item 模型用于将所有内容链接在一起。
以下是模型:
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 中考虑了以下内容:
- 连接 Tag、Tag_Item 和 Location(位置为“美国”)。
- 按标签对其进行分组。
- 按 Tag_ID 计数(或类似的内容)排序。
但我不知道如何在 Django ORM 中传输它。
您能帮我了解如何编写这种复杂的关系查询吗?
最佳答案
您需要一些东西才能开始这样的查询:
-
annotate()
,将用于执行并添加计数字段。 -
order_by()
,将用于对查询集进行排序。 -
values()
,将用于检索表的特定列。 - 关于
GROUP BY ... COUNT
的注释: How to execute a GROUP BY ... COUNT or SUM in Django ORM? - 您可以通过
__
notation 获取外键的相关字段.
您可以简化所描述的查询:
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
... | ...
现在您可以从该词典中检索前五个标签。
关于python - 如何使用 ORM 进行相当于 SQL 计数、分组和连接查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40175134/