我正在尝试使用过去7天内销售的总重量来注释每个产品。
使用extra()
修饰符代替annotate()
,因为当两个注释都被注释时,会有另一个查询导致错误的结果。
class Product(models.Model):
name = models.CharField()
class Customer(models.Model):
name = models.CharField()
class Template(models.Model):
customer = models.ForeignKey(Customer)
product = models.ForeignKey(Product, related_name='template_product')
class Order(models.Model):
customer = models.ForeignKey(Customer)
date = models.DateField()
class OrderLine(models.Model):
order = models.ForeignKey(Order, related_name='orderline_order')
product = models.ForeignKey(Product, related_name='orderline_product')
weight = models.DecimalField()
下面的查询导致ProgrammingError:表“order”缺少FROM子句条目。我对SQL并不完全熟悉,所以我不完全确定如何解决这个问题。为了获得每个OrderLine的准确日期,我是否需要进行某种联接?
query = Product.objects.all()
date = timezone.now() - timedelta(days=7)
query = query.extra(
select={
'weight_sold': "select sum(order_orderline.weight) from order_orderline
where order_orderline.product_id = product_product.id and
order_orderline.order.date > %s"
},
select_params=(date,)
)
引导我extra()
的冲突注释:
以下注释不能一起使用,因为结果值不是实际的Sum和Count值(太大)
query = query.annotate(weight_sold=Sum(
Case(When(Q(orderline_product__order__date__gte=date), then='orderline_product__weight')),
output_field=DecimalField())).annotate(template_count=Count('template_product'))
答案 0 :(得分:0)
Django ORM应该在不使用原始SQL的情况下解决这个问题
在编辑时,可以在不使用bind
的情况下进一步扩展查询集。看起来您想要过滤查询集。使用on
和extra
的方法过于复杂,绝对没有必要。
这应该适合你:
Case
答案 1 :(得分:0)
nifi/${NIFI_KEYTAB_HOSTNAME}@REALM