2015-06-05 30 views
0

增加了額外的列組,我有以下查詢集:Django的通過

Pago.objects.filter(created__range=(self.inicio, self.fin)).values('tipo__nombre').annotate(monto=Sum('monto')) 

而且它產生的SQL語句:

SELECT "invoice_tipopago"."nombre", SUM("invoice_pago"."monto") AS "monto" FROM "invoice_pago" INNER JOIN "invoice_tipopago" ON ("invoice_pago"."tipo_id" = "invoice_tipopago"."id") WHERE "invoice_pago"."created" BETWEEN 2015-01-01 00:00:00-06:00 AND 2015-06-04 14:18:00-06:00 GROUP BY "invoice_tipopago"."nombre", "invoice_pago"."modified", "invoice_pago"."created" ORDER BY "invoice_pago"."modified" DESC, "invoice_pago"."created" DESC 

它補充說,我是多餘的修改和創建的列沒有指定,我想知道如何避免它。應該注意的是,Pago是從django-extensions TimeStampedModel類派生而來的。

在此先感謝。

回答

2

我看了看TimeStampedModel並在類meta設置默認ordering

class TimeStampedModel(models.Model): 
""" TimeStampedModel 
An abstract base class model that provides self-managed "created" and 
"modified" fields. 
""" 
created = CreationDateTimeField(_('created')) 
modified = ModificationDateTimeField(_('modified')) 

class Meta: 
    get_latest_by = 'modified' 
    ordering = ('-modified', '-created',) 
      # ^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    abstract = True 

see in github

你可能會覆蓋提供了另一種過濾器,以通過排序(如tipo__nombremonto)例如:

Pago.objects.filter(
    created__range=(self.inicio, self.fin) 
).values(
    'tipo__nombre' 
).annotate(
    monto=Sum('monto') 
).order_by(
    'tipo__nombre' 
) 
+1

是的,就是這樣,我只是將order_by()添加到remov所有的訂購,我不知道爲什麼我從來沒有閱讀過有關Django ORM的這種行爲,它明確表示,除非你這樣做,否則它永遠不會自動刪除你指定的任何順序。 – SpectralAngel