如何在django中对外键模型执行过滤或聚合或注释

时间:2018-06-13 09:54:31

标签: django

我有用户模型

class User(models.Model):
    first_name = models.CharField(max_length=30)

和订单型号

class Order(models.Model):
        user = models.ForgienKey(User)
        product_name = models.CharField(max_length=30)

创建2个用户

hi = User.objects.create(firs_name = 'hi')


bye = User.objects.create(firs_name = 'bye')

我创建了3个订单

Order.objects.create(product_name='nokia',user=hi)
Order.objects.create(product_name='samsung',user=hi)
Order.objects.create(product_name='nokia',user=bye)

所以怎么算诺基亚有2个用户和三星有1个用户在django使用过滤器或聚合或注释?并输出这样的东西(应按顺序计算值)

{
 "nokia":"2",
"samsung":"1"
}

Django 1.8

4 个答案:

答案 0 :(得分:0)

您可以根据需要使用默认计数功能来获取有或没有过滤器的对象数量,如下所示。

data_dict = {}
for cat in Order.objects.all()
    data_dict.update({cat.product_name : 0 })
for obj in Order.objects.all():
    if obj.product_name in data_dict.keys():
        data_dict[obj.product_name] += 1

打印data_dict将为您提供预期的输出

答案 1 :(得分:0)

objects.create(first_name = 'hi')
hi.save()

bye = User.objects.create(first_name = 'bye')
bye.save()

此处first_name应与模型中的字段名称相同。

l=[]
for o in Order.objects.all():
    l.append(str(o.product_name))

是列表,其中包含列表中的所有产品(重复)

d = {x:l.count(x) for x in l}
print d

d以字典格式提供数据,即

{'nokia': 2, 'samsung': 1}

答案 2 :(得分:0)

使用以下查询

orders = Order.objects
             .values_list('product_name')
             .annotate(usercount=Count('user'))        
orders = dict(orders) # This must be of your json key values.

OR

orders = dict(orders.iterlists()) # This must be of your json key values.

答案 3 :(得分:0)

尝试此操作,您将获得json格式的输出

from django.db.models import Count
Order.objects.values('product_name')
             .annotate(usercount=Count('user'))