我有一些型号:
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
)
现在我没有任何疑问