【问题标题】:Django queryset equivalent to the following SQL相当于以下 SQL 的 Django 查询集
【发布时间】:2015-12-23 14:08:24
【问题描述】:

我有一堂课:

class ImgObject(models.Model):
 img_file = models.CharField(max_length=128,unique=False)
 img_id = models.IntegerField(default=0)
 img_tags = models.CharField(max_length=320,unique=False)
 img_title = models.CharField(max_length=128,unique=False)

每个 img_title 都会有对应的 img_tags。可能有多行具有不同 img_tag 的 img_title 行。例如,

img_title    img_tags
---------------------
buildingA    yellow
buildingB    seaside
buildingA    apartment,urban
buildingC    suburban
buildingA    yellow

我希望我的查询返回每个 img_title 的 img_tags 以及每个标签的计数。 例如,

SELECT DISTINCT img_title,img_tags, COUNT(img_tags) FROM ImgObject

应该返回

buildingA : yellow(2),apartment(1),urban(1)
buildingB : seaside
buildingC : suburban

我知道应该有一些迭代过程正在进行,但我无法将其放入 Django 查询中。 这是我尝试过的,

for i in ImgObject.objects.values('img_title'):
    x = ImgObject.objects.filter('img_title').values('img_tags')
    y = ImgObject.objects.filter('img_title').values('img_tags').distinct().count()

print x,":",y

但这会引发“ValueError: too many values to unpack”错误。

帮我写一段代码来实现这个输出!

【问题讨论】:

    标签: sql django loops iteration equivalent


    【解决方案1】:

    免责声明:此代码未经测试

    试试这个:

    from django.db.models import Count
    ImgObject.objects.annotate(c=Count('img_tags')).values('img_title').distinct()
    

    【讨论】:

    • 对此我不确定。这是否给出了每个 img_title 的结果以及该 img_title 有多少个 img_tags? OP 想要每个 img_title 的每个 img_tag 的计数,对吗?
    • @ShangWang 是的,我使用过这样的查询来获取 Sum,我认为这可以完成这项工作。我没有测试过。我现在没有要测试的数据库。
    • 这个查询给出了不同的 img_title 列表,但没有给出 img_tags 及其计数。
    【解决方案2】:

    所以,经过大量的逻辑思考、反复试验,我想出了一个方法来做到这一点:)

    for i in ImgObject.objects.values_list('img_title',flat=True).distinct():
              for j in ImgObject.objects.filter(img_title=str(i)).distinct().values_list('img_tags').annotate(the_count=Count('img_tags')):
                    (j1,j2)= j
                    print i,j1,j2
    

    这并不完全有效。即使我提到不同,它仍然多次返回第一列。 所以输出看起来有点像这样。

    buildingA : yellow(2)
    buildingA : apartment(1)
    buildingA : urban(1)
    buildingB : seaside
    buildingC : suburban
    

    而不是首选

    buildingA : yellow(2),apartment(1),urban(1)
    buildingB : seaside
    buildingC : suburban 
    

    我仍然希望我能以后一种格式打印它。如果有人有想法,欢迎优化:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      相关资源
      最近更新 更多