python - 如何使用 ORM 进行相当于 SQL 计数、分组和连接查询?

标签 python django django-orm

我有可以与图像和位置关联的标签。

  • 标签是唯一的。
  • 图片和位置可以有多个标签。
  • 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 中传输它。

您能帮我了解如何编写这种复杂的关系查询吗?

最佳答案

您需要一些东西才能开始这样的查询:

<小时/>

您可以简化所描述的查询:

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/

相关文章:

Python - 在字典列表中查找重复项并将它们分组

python - 用于远程控制PiBot的SocketServer(python)

python - 如何重复音频wav文件,使其在python中至少变为6秒长

python - 如何在 Python 中使用 Pandas 创建一系列数字

python - django-rest-framework 3.0 在嵌套序列化程序中创建或更新

python - Django ForeignKey 过滤器问题

django.db.utils.ProgrammingError : in DJango application

python - Django 交叉表模型结构

python - 使用 unique_together 和保存经过身份验证的用户时出现问题

python - django ORM - 在 M2M 上排除,F 功能不起作用