【问题标题】:How to use the ORM for the equivalent of a SQL count, group and join query?如何将 ORM 用于相当于 SQL 计数、组和连接查询?
【发布时间】:2017-03-03 16:13:11
【问题描述】:

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

  • 标签是独一无二的。
  • 图像和位置可以有很多标签。
  • 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,其中 location 为“US”。
  • 按标签分组。
  • 按 Tag_ID 计数(或类似的东西)对其进行排序。

但我不知道如何在 Django ORM 中传输它。

你能帮我写出那种复杂的关系查询吗?

【问题讨论】:

标签: python django django-orm


【解决方案1】:

您需要做一些事情来开始这样的查询:


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

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
  ...  |   ...

现在您可以从该词典中检索前五个标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-30
    • 2023-03-14
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多