2013-08-08 8 views
10

Sembra che Django di default aggiunga ORDER BY alle domande. Posso cancellarlo?Posso rimuovere ORDER BY da una query ORG Django?

from slowstagram.models import InstagramMedia 
print InstagramMedia.objects.filter().query 
SELECT 
    `slowstagram_instagrammedia`.`id`, 
    `slowstagram_instagrammedia`.`user_id`, 
    `slowstagram_instagrammedia`.`image_url`, 
    `slowstagram_instagrammedia`.`video_url`, 
    `slowstagram_instagrammedia`.`created_time`, 
    `slowstagram_instagrammedia`.`caption`, 
    `slowstagram_instagrammedia`.`filter`, 
    `slowstagram_instagrammedia`.`link`, 
    `slowstagram_instagrammedia`.`attribution_id`, 
    `slowstagram_instagrammedia`.`likes_count`, 
    `slowstagram_instagrammedia`.`type` 
FROM 
    `slowstagram_instagrammedia` 
ORDER BY 
    `slowstagram_instagrammedia`.`id` 
ASC 

`` `

risposta

4

È possibile utilizzare: clear_ordering metodo dal interrogazione

"""Removes any ordering settings. 

If 'force_empty' is True, there will be no ordering in the resulting 
query (not even the model's default). 
""" 

Esempio:

>>> from products.models import Product 
>>> products = Product.objects.filter(shortdesc='falda').order_by('id') 
>>> print products.query 
SELECT "products_product"."id", "products_product"."shortdesc" 
WHERE "products_product"."shortdesc" = falda 
ORDER BY "products_product"."id" ASC 
>>> products.query.clear_ordering() 
>>> print products.query 
SELECT "products_product"."id", "products_product"."shortdesc" 
WHERE "products_product"."shortdesc" = falda 
+0

In Django 1.6 è necessario utilizzare uno 'clear_ordering (True)' o 'clear_ordering (Falso)', che indica se forzare compensazione di inadempienza ordinamento del modello. – aehlke

15

In realtà, basta fare un query.order_by() è sufficiente.

Qui è l'attuazione di order_by, per il vostro riferimento -

def order_by(self, *field_names): 
    """ 
    Returns a new QuerySet instance with the ordering changed. 
    """ 
    assert self.query.can_filter(), \ 
     "Cannot reorder a query once a slice has been taken." 
    obj = self._clone() 
    obj.query.clear_ordering(force_empty=False) 
    obj.query.add_ordering(*field_names) 
    return obj 
+1

Sfortunatamente 'force_empty = False' è la chiave qui - non cancella l'ordine di default di un modello. – aehlke

+2

I ['order_by' docs] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.order_by) dicono * Se non lo fai vuoi che qualsiasi ordine sia applicato a una query, nemmeno l'ordinamento predefinito, chiama 'order_by()' senza parametri. * – poolie

Problemi correlati