我可以从Django ORM查询中删除ORDER BY吗?

Kit*_*nde 15 django-orm

看起来Django默认会添加ORDER BY到查询中.我可以清除它吗?

from slowstagram.models import InstagramMedia
print InstagramMedia.objects.filter().query
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

```

jif*_*yin 26

实际上,做一个query.order_by()就足够了.

以下是实施order_by,供您参考 -

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
Run Code Online (Sandbox Code Playgroud)

  • [`order_by` docs](https://docs.djangoproject.com/en/1.9/ref/models/querysets/#django.db.models.query.QuerySet.order_by)说*如果你不想要任何要应用于查询的顺序,甚至是默认顺序,都不带参数调用`order_by()`.* (5认同)
  • @aehlke – 调用不带参数的 add_ordering _will_ 清除模型的默认排序,请检查源代码。 (2认同)

小智 6

您可以使用:clear_ordering查询方法

"""Removes any ordering settings. 

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

例:

>>> 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
Run Code Online (Sandbox Code Playgroud)