django注释和整合

时间:2018-06-26 18:50:23

标签: django django-orm

我有一些型号:

class User(models.Model):
    username = models.CharField(max_lenght=50)

class Order(models.Model):
    price = models.IntegerField()
    user = models.ForeignKey(User, related_name='orders')
    created_at = models.DateTimeField(auto_now_add=True)

当我想将所有价格添加到用户查询时,我执行以下查询:

User.objects.annotate(all_prices=Sum('orders__price'))

但是,当我不想添加所有价格时(仅添加一年前和早期创建的价格):

我想是这样的:

orders = Order.objects.filter(user_id=OuterRef('id'), 
                   created_at__gte=timezone.now() - 
                   timezone.timedelta(days=365))


User.objects.annotate(all_prices=Sum(orders.values_list('price'))

但是错误是这样的:

FieldError:无法解析表达式类型,输出域未知

如何查询?

我找到了解决方法:

date = timezone.now() - timezone.timedelta(365)
User.objects.annotate(
      all_prices=Sum(
        'orders__price', 
         filter=Q(orders_created_at__gte=date)
)

但是我使用django-1.11并在django 2.0中添加的Sum中进行过滤

我已经找到了Django 1.11的解决方案: 解决方法如下:

date = timezone.now() - timezone.timedelta(365)
User.objects.annotate(
      all_prices=Sum(Case(
          When(orders_created_at__gte=date, 
               then='orders__price'), 
          default=0
)

现在我没有任何疑问

0 个答案:

没有答案