【问题标题】:Django - QuerySet - Get count for all determined child objects inside all parent objectsDjango - QuerySet - 获取所有父对象内所有已确定子对象的计数
【发布时间】:2016-08-17 17:12:12
【问题描述】:

我有这个模型:

class Order(models.Model):
    #bunch of fields#

class Laptop(models.Model):
    #bunch of fields#

class Camera(models.Model):
    #bunch of fields#

class MusicPlayer(models.Model):
    #bunch of fields#

最后三个有一个与 Order 类关联的外键。 我需要通过 QuerySet 检索所有订单的每个子对象的总计数,按每个订单分组。

结果应如下所示: 笔记本电脑:5 相机:10 音乐播放器:1

我尝试过使用不同的 django 查询,但我得到的只是检索每个订单的计数,而不是所有订单的计数。

我知道这可以很容易地通过单独查询每一个来完成,但我被要求在一个查询中完成所有操作。

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    将related_name 添加到您的模型中:

    class Laptop(models.Model):
        order = models.ForeignKey(Order, related_name='laptops')
    
    class Camera(models.Model):
        order = models.ForeignKey(Order, related_name='cameras')
    
    class MusicPlayer(models.Model):
        order = models.ForeignKey(Order, related_name='music_players')
    

    然后您可以使用annotateCount 检索相关模型的数量:

    from django.db.models import Count
    
    orders = Order.objects.annotate(laptops_count=Count('laptops'), cameras_count=Count('cameras'), music_players_count=Count('music_players'))
    print(orders.laptops_count)
    print(orders.cameras_count)
    print(orders.music_players_count)
    

    【讨论】:

    • 感谢您的评论!由于您尝试直接从订单对象访问笔记本电脑,它将返回一个 AttributeError。这和我遇到的问题一样,我不想一个一个地访问所有对象(例如:orders[0])来访问计数。
    • 顺便说一下,给注释值赋予与“related_name”相同的名称会返回错误
    • 你说得对,我已经确定了答案。它只使用一个查询,您可以使用 print(orders.query) 打印查询并检查 SQL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多