added 'ensure_index' and 'order_by' methods to queryset.

This commit is contained in:
blackbrrr 2009-12-18 11:35:26 -06:00
parent 12a7fc1af1
commit aa9cba38c4

View File

@ -11,8 +11,22 @@ class QuerySet(object):
def __init__(self, document, collection):
self._document = document
self._collection = collection
self._query = {'_types': self._document._class_name}
self._query = {}
self._cursor_obj = None
self._ordering = []
def ensure_index(self, key_or_list, direction=None):
"""Ensure that the given indexes are in place.
"""
if isinstance(key_or_list, basestring):
# single-field indexes needn't specify a direction
if key_or_list.startswith("-"):
key_or_list = key_or_list[1:]
self._collection.ensure_index(key_or_list)
elif isinstance(key_or_list, (list, tuple)):
print key_or_list
self._collection.ensure_index(key_or_list)
return self
def __call__(self, **query):
"""Filter the selected documents by calling the queryset with a query.
@ -92,6 +106,35 @@ class QuerySet(object):
self._cursor.skip(n)
return self
def order_by(self, *params):
"""Apply ordering conditions, Django-style.
e.g., ``Model.objects.().order_by("-published_date", "ordering")``
will order first by ``published_date DESC``, and then ``ordering ASC``.
"""
if not params:
self._ordering = []
for param in params:
if param.startswith("-"):
param = param[1:]
sort_dir = pymongo.DESCENDING
else:
sort_dir = pymongo.ASCENDING
sort_rule = (param, sort_dir)
if not sort_rule in self._ordering:
self._ordering.append(sort_rule)
self._cursor.sort(self._ordering)
return self
def explain(self, format=False):
plan = self._cursor.explain()
if format:
import pprint
plan = pprint.pformat(plan)
return plan
def delete(self):
"""Delete the documents matched by the query.
"""