Django:使用extra()注释查询集并选择日期

时间:2018-04-05 12:02:32

标签: python sql django postgresql

我正在尝试使用过去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'))

2 个答案:

答案 0 :(得分:0)

Django ORM应该在不使用原始SQL的情况下解决这个问题 在编辑时,可以在不使用bind的情况下进一步扩展查询集。看起来您想要过滤查询集。使用onextra的方法过于复杂,绝对没有必要。

这应该适合你:

Case

答案 1 :(得分:0)

使用Subquery()

管理完成任务
nifi/${NIFI_KEYTAB_HOSTNAME}@REALM