2015-06-05 2 views
0

У меня есть следующие QuerySet: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 является производным от класса TimeStampedModel с расширением django.

Заранее спасибо.

ответ

2

Я посмотрел на TimeStampedModel и установить по умолчанию ordering в классе meta:

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__nombre или monto), ex:

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

Yup, это было, я просто добавил order_by(), чтобы удалить Все, что я заказываю, я не знаю, почему я никогда не читал об этом поведении на Django ORM, в нем конкретно говорится, что он никогда автоматически не удаляет какие-либо заказы, которые вы укажете, если вы этого не сделаете. – SpectralAngel

Смежные вопросы