Author: Alex Date: 2010-06-21 15:28:47 -0500 (Mon, 21 Jun 2010) New Revision: 13372
Modified: django/branches/soc2010/query-refactor/django/contrib/mongodb/compiler.py django/branches/soc2010/query-refactor/django/db/models/query.py django/branches/soc2010/query-refactor/tests/regressiontests/mongodb/tests.py Log: [soc2010/query-refactor] Implemented values (and values_list). Modified: django/branches/soc2010/query-refactor/django/contrib/mongodb/compiler.py =================================================================== --- django/branches/soc2010/query-refactor/django/contrib/mongodb/compiler.py 2010-06-21 19:14:13 UTC (rev 13371) +++ django/branches/soc2010/query-refactor/django/contrib/mongodb/compiler.py 2010-06-21 20:28:47 UTC (rev 13372) @@ -56,16 +56,28 @@ return {k: {"$not": v}} return {k: {"$ne": v}} + def get_fields(self, aggregates): + if self.query.select: + fields = [] + for alias, field in self.query.select: + assert alias == self.query.model._meta.db_table + if field == self.query.model._meta.pk.column: + field = "_id" + fields.append(field) + return fields + if not aggregates: + assert self.query.default_cols + return None + def build_query(self, aggregates=False): assert len([a for a in self.query.alias_map if self.query.alias_refcount[a]]) <= 1 - if not aggregates: - assert self.query.default_cols assert not self.query.distinct assert not self.query.extra assert not self.query.having filters = self.get_filters(self.query.where) - cursor = self.connection.db[self.query.model._meta.db_table].find(filters) + fields = self.get_fields(aggregates=aggregates) + cursor = self.connection.db[self.query.model._meta.db_table].find(filters, fields=fields) if self.query.order_by: cursor = cursor.sort([ (ordering.lstrip("-"), DESCENDING if ordering.startswith("-") else ASCENDING) @@ -79,10 +91,15 @@ def results_iter(self): query = self.build_query() + fields = self.get_fields(aggregates=False) + if fields is None: + fields = [ + f.column if f is not self.query.model._meta.pk else "_id" + for f in self.query.model._meta.fields + ] for row in query: yield tuple( - row[f.column if f is not self.query.model._meta.pk else "_id"] - for f in self.query.model._meta.fields + row[f] for f in fields ) def has_results(self): Modified: django/branches/soc2010/query-refactor/django/db/models/query.py =================================================================== --- django/branches/soc2010/query-refactor/django/db/models/query.py 2010-06-21 19:14:13 UTC (rev 13371) +++ django/branches/soc2010/query-refactor/django/db/models/query.py 2010-06-21 20:28:47 UTC (rev 13372) @@ -843,12 +843,12 @@ if self._fields: self.extra_names = [] self.aggregate_names = [] + self.query.default_cols = False if not self.query.extra and not self.query.aggregates: # Short cut - if there are no extra or aggregates, then # the values() clause must be just field names. self.field_names = list(self._fields) else: - self.query.default_cols = False self.field_names = [] for f in self._fields: # we inspect the full extra_select list since we might Modified: django/branches/soc2010/query-refactor/tests/regressiontests/mongodb/tests.py =================================================================== --- django/branches/soc2010/query-refactor/tests/regressiontests/mongodb/tests.py 2010-06-21 19:14:13 UTC (rev 13371) +++ django/branches/soc2010/query-refactor/tests/regressiontests/mongodb/tests.py 2010-06-21 20:28:47 UTC (rev 13372) @@ -113,6 +113,37 @@ artists[2:], lambda a: a, ) + + def test_values(self): + a = Artist.objects.create(name="Steve Perry", good=True) + + self.assertQuerysetEqual( + Artist.objects.values(), [ + {"name": "Steve Perry", "good": True, "current_group_id": None, "id": a.pk}, + ], + lambda a: a, + ) + + self.assertQuerysetEqual( + Artist.objects.values("name"), [ + {"name": "Steve Perry"}, + ], + lambda a: a, + ) + + self.assertQuerysetEqual( + Artist.objects.values_list("name"), [ + ("Steve Perry",) + ], + lambda a: a, + ) + + self.assertQuerysetEqual( + Artist.objects.values_list("name", flat=True), [ + "Steve Perry", + ], + lambda a: a, + ) def test_not_equals(self): q = Group.objects.create(name="Queen", year_formed=1971) -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.