Re: Extension to QuerySet.values()

2013-10-10 Thread Arnaud Delobelle


On Thursday, 10 October 2013 15:19:32 UTC+1, Ramiro Morales wrote:
>
>
> On Oct 10, 2013 10:02 AM, "Arnaud Delobelle"  
> wrote:
> >
> > Hi Russ,
> >
> > Thanks for the feedback.  I agree that this could possibly be integrated 
> into the values() method.  I just used a new method in order to minimise 
> interference with our existing code.  I'll read the 'contributing' document 
> then see if I can find a bit of spare time to do this properly!
> >
> FYI IIUC this has been reported in ticket 16735:
>
> https://code.djangoproject.com/ticket/16735
>
 Yes.  The patch also seems to allow using the aliases in e.g. order_by() 
or annotate() clauses, which I hadn't got round to looking at yet.  It is 
marked as needing improvement but looking at the change history I'm not 
sure what needs to be improved.

-- 
Arnaud

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/a2cbb3b0-e014-46c0-99d5-b71acbeb4aa4%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: Extension to QuerySet.values()

2013-10-10 Thread Ramiro Morales
On Oct 10, 2013 10:02 AM, "Arnaud Delobelle"  wrote:
>
> Hi Russ,
>
> Thanks for the feedback.  I agree that this could possibly be integrated
into the values() method.  I just used a new method in order to minimise
interference with our existing code.  I'll read the 'contributing' document
then see if I can find a bit of spare time to do this properly!
>
FYI IIUC this has been reported in ticket 16735:

https://code.djangoproject.com/ticket/16735

>
> --
> Arnaud
>
>
> On Thursday, 10 October 2013 00:44:45 UTC+1, Russell Keith-Magee wrote:
>>
>> Hi Arnaud,
>>
>> I can see value in the feature you're describing here.
>>
>> From a design perspective, my question would be whether a whole new
method is needed, or whether it could be integrated into the existing
values() method. There will be some complications around the 'flat' key,
but its worth exploring the possibilities before we introduce a whole new
API entry point.
>>
>> If you're interested in taking this to the next level, we'll need tests
and documentation for the new feature. If you want to discuss finer details
of the API, the django-developers mailing list is a better forum. Our
contribution process is also documented; if you want to get involved in
contributing to the internals of Django, it's worth giving this document a
read [1].
>>
>> [1] https://docs.djangoproject.com/en/1.5/internals/contributing/
>>
>> Yours,
>> Russ Magee %-)
>>
>> On Wed, Oct 9, 2013 at 6:19 PM, Arnaud Delobelle 
wrote:
>>>
>>> Hi there,
>>>
>>> I quite often find that when using queryset.values() I would like to be
able to define myself the values of the keys, especially when they span
models:
>>>
>>> e.g.
>>>
>>>my_query_set.values('foo__bar__baz', 'quux',
'another__long__field__name')
>>>
>>> Then I end up with dictionaries with unnecessarily long keys.  What I'd
like to be able to do is something like:
>>>
>>> my_query_set.values('quux', baz='foo__bar__baz',
name='another__long__field__name')
>>>
>>> Executing this would yield dictionaries of the type:
>>>
>>> {'quux': 2, 'baz': 'type 2', 'name': 'Frobulon'}
>>>
>>>
>>> I've had a quick look at the ValuesQuerySet class and there seems to be
a simple enough way to get this feature.  I'm presenting it in the form of
a new ValuesQuerySet subclass and a monkey patch to the parent QuerySet.
 It's not unlikely that it will break some things as this is my first peek
into the QuerySet class.  I'd like to know if this is something that other
people feel the need for and if it is worth pushing for inclusion of such a
feature into django.
>>>
>>> Cheers,
>>>
>>> Arnaud
>>>
>>> 
>>>
>>> from django.db.models.query import QuerySet, ValuesQuerySet
>>>
>>>
>>> class ValuesDictQuerySet(ValuesQuerySet):
>>>
>>> def iterator(self):
>>> # Purge any extra columns that haven't been explicitly asked for
>>> extra_names = list(self.query.extra_select)
>>> field_map = self.field_map
>>> field_names = [field_map.get(fname, fname) for fname in
self.field_names]
>>> aggregate_names = list(self.query.aggregate_select)
>>>
>>> names = extra_names + field_names + aggregate_names
>>>
>>> for row in self.query.get_compiler(self.db).results_iter():
>>> yield dict(zip(names, row))
>>>
>>> def _clone(self, klass=None, setup=False, **kwargs):
>>> c = super(ValuesDictQuerySet, self)._clone(klass, **kwargs)
>>> c.field_map = self.field_map
>>> return c
>>>
>>>
>>> def QuerySet_values_dict(self, *field_list, **field_dict):
>>> fields = list(field_list)
>>> fields.extend(field_dict.values())
>>> field_map = dict(zip(field_dict.values(), field_dict.keys()))
>>> return self._clone(klass=ValuesDictQuerySet, setup=True,
_fields=fields, field_map=field_map)
>>>
>>>
>>> # Now we monkey-patch QuerySet with the new method
>>> QuerySet.values_dict = QuerySet_values_dict
>>>
>>> --
>>> You received this message because you are subscribed to the Google
Groups "Django users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
an email to django-users...@googlegroups.com.
>>> To post to this group, send email to django...@googlegroups.com.
>>>
>>> Visit this group at http://groups.google.com/group/django-users.
>>> To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/d4f8d6f0-3723-44d5-991a-9c6b3c13165d%40googlegroups.com
.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
> --
> You received this message because you are subscribed to the Google Groups
"Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
email to django-users+unsubscr...@googlegroups.com.
> To post to this group, send email to django-users@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit

Re: Extension to QuerySet.values()

2013-10-10 Thread Arnaud Delobelle
Hi Russ,

Thanks for the feedback.  I agree that this could possibly be integrated 
into the values() method.  I just used a new method in order to minimise 
interference with our existing code.  I'll read the 'contributing' document 
then see if I can find a bit of spare time to do this properly!

Cheers,

-- 
Arnaud

On Thursday, 10 October 2013 00:44:45 UTC+1, Russell Keith-Magee wrote:
>
> Hi Arnaud,
>
> I can see value in the feature you're describing here.
>
> From a design perspective, my question would be whether a whole new method 
> is needed, or whether it could be integrated into the existing values() 
> method. There will be some complications around the 'flat' key, but its 
> worth exploring the possibilities before we introduce a whole new API entry 
> point.
>
> If you're interested in taking this to the next level, we'll need tests 
> and documentation for the new feature. If you want to discuss finer details 
> of the API, the django-developers mailing list is a better forum. Our 
> contribution process is also documented; if you want to get involved in 
> contributing to the internals of Django, it's worth giving this document a 
> read [1].
>
> [1] https://docs.djangoproject.com/en/1.5/internals/contributing/
>
> Yours,
> Russ Magee %-)
>
> On Wed, Oct 9, 2013 at 6:19 PM, Arnaud Delobelle 
>  > wrote:
>
>> Hi there,
>>
>> I quite often find that when using queryset.values() I would like to be 
>> able to define myself the values of the keys, especially when they span 
>> models:
>>
>> e.g.
>>
>>my_query_set.values('foo__bar__baz', 'quux', 
>> 'another__long__field__name')
>>
>> Then I end up with dictionaries with unnecessarily long keys.  What I'd 
>> like to be able to do is something like:
>>
>> my_query_set.values('quux', baz='foo__bar__baz', 
>> name='another__long__field__name')
>>
>> Executing this would yield dictionaries of the type:
>>
>> {'quux': 2, 'baz': 'type 2', 'name': 'Frobulon'}
>>
>>
>> I've had a quick look at the ValuesQuerySet class and there seems to be a 
>> simple enough way to get this feature.  I'm presenting it in the form of a 
>> new ValuesQuerySet subclass and a monkey patch to the parent QuerySet. 
>>  It's not unlikely that it will break some things as this is my first peek 
>> into the QuerySet class.  I'd like to know if this is something that other 
>> people feel the need for and if it is worth pushing for inclusion of such a 
>> feature into django.
>>
>> Cheers,
>>
>> Arnaud
>>
>> 
>>
>> from django.db.models.query import QuerySet, ValuesQuerySet
>>
>>
>> class ValuesDictQuerySet(ValuesQuerySet):
>>
>> def iterator(self):
>> # Purge any extra columns that haven't been explicitly asked for
>> extra_names = list(self.query.extra_select)
>> field_map = self.field_map
>> field_names = [field_map.get(fname, fname) for fname in 
>> self.field_names]
>> aggregate_names = list(self.query.aggregate_select)
>>
>> names = extra_names + field_names + aggregate_names
>>
>> for row in self.query.get_compiler(self.db).results_iter():
>> yield dict(zip(names, row))
>>
>> def _clone(self, klass=None, setup=False, **kwargs):
>> c = super(ValuesDictQuerySet, self)._clone(klass, **kwargs)
>> c.field_map = self.field_map
>> return c
>>
>>
>> def QuerySet_values_dict(self, *field_list, **field_dict):
>> fields = list(field_list)
>> fields.extend(field_dict.values())
>> field_map = dict(zip(field_dict.values(), field_dict.keys()))
>> return self._clone(klass=ValuesDictQuerySet, setup=True, 
>> _fields=fields, field_map=field_map)
>>
>>
>> # Now we monkey-patch QuerySet with the new method
>> QuerySet.values_dict = QuerySet_values_dict
>>
>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Django users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to django-users...@googlegroups.com .
>> To post to this group, send email to django...@googlegroups.com
>> .
>> Visit this group at http://groups.google.com/group/django-users.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/django-users/d4f8d6f0-3723-44d5-991a-9c6b3c13165d%40googlegroups.com
>> .
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/24ceded6-9bb8-454b-968e-f3883fe4c14e%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Re: Extension to QuerySet.values()

2013-10-09 Thread Russell Keith-Magee
Hi Arnaud,

I can see value in the feature you're describing here.

>From a design perspective, my question would be whether a whole new method
is needed, or whether it could be integrated into the existing values()
method. There will be some complications around the 'flat' key, but its
worth exploring the possibilities before we introduce a whole new API entry
point.

If you're interested in taking this to the next level, we'll need tests and
documentation for the new feature. If you want to discuss finer details of
the API, the django-developers mailing list is a better forum. Our
contribution process is also documented; if you want to get involved in
contributing to the internals of Django, it's worth giving this document a
read [1].

[1] https://docs.djangoproject.com/en/1.5/internals/contributing/

Yours,
Russ Magee %-)

On Wed, Oct 9, 2013 at 6:19 PM, Arnaud Delobelle  wrote:

> Hi there,
>
> I quite often find that when using queryset.values() I would like to be
> able to define myself the values of the keys, especially when they span
> models:
>
> e.g.
>
>my_query_set.values('foo__bar__baz', 'quux',
> 'another__long__field__name')
>
> Then I end up with dictionaries with unnecessarily long keys.  What I'd
> like to be able to do is something like:
>
> my_query_set.values('quux', baz='foo__bar__baz',
> name='another__long__field__name')
>
> Executing this would yield dictionaries of the type:
>
> {'quux': 2, 'baz': 'type 2', 'name': 'Frobulon'}
>
>
> I've had a quick look at the ValuesQuerySet class and there seems to be a
> simple enough way to get this feature.  I'm presenting it in the form of a
> new ValuesQuerySet subclass and a monkey patch to the parent QuerySet.
>  It's not unlikely that it will break some things as this is my first peek
> into the QuerySet class.  I'd like to know if this is something that other
> people feel the need for and if it is worth pushing for inclusion of such a
> feature into django.
>
> Cheers,
>
> Arnaud
>
> 
>
> from django.db.models.query import QuerySet, ValuesQuerySet
>
>
> class ValuesDictQuerySet(ValuesQuerySet):
>
> def iterator(self):
> # Purge any extra columns that haven't been explicitly asked for
> extra_names = list(self.query.extra_select)
> field_map = self.field_map
> field_names = [field_map.get(fname, fname) for fname in
> self.field_names]
> aggregate_names = list(self.query.aggregate_select)
>
> names = extra_names + field_names + aggregate_names
>
> for row in self.query.get_compiler(self.db).results_iter():
> yield dict(zip(names, row))
>
> def _clone(self, klass=None, setup=False, **kwargs):
> c = super(ValuesDictQuerySet, self)._clone(klass, **kwargs)
> c.field_map = self.field_map
> return c
>
>
> def QuerySet_values_dict(self, *field_list, **field_dict):
> fields = list(field_list)
> fields.extend(field_dict.values())
> field_map = dict(zip(field_dict.values(), field_dict.keys()))
> return self._clone(klass=ValuesDictQuerySet, setup=True,
> _fields=fields, field_map=field_map)
>
>
> # Now we monkey-patch QuerySet with the new method
> QuerySet.values_dict = QuerySet_values_dict
>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to django-users+unsubscr...@googlegroups.com.
> To post to this group, send email to django-users@googlegroups.com.
> Visit this group at http://groups.google.com/group/django-users.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/d4f8d6f0-3723-44d5-991a-9c6b3c13165d%40googlegroups.com
> .
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAJxq848VVVdKcAPRGnV5i7%2BfhLXvm28__De7ey91nYd-rXeZKA%40mail.gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.


Extension to QuerySet.values()

2013-10-09 Thread Arnaud Delobelle
Hi there,

I quite often find that when using queryset.values() I would like to be 
able to define myself the values of the keys, especially when they span 
models:

e.g.

   my_query_set.values('foo__bar__baz', 'quux', 
'another__long__field__name')

Then I end up with dictionaries with unnecessarily long keys.  What I'd 
like to be able to do is something like:

my_query_set.values('quux', baz='foo__bar__baz', 
name='another__long__field__name')

Executing this would yield dictionaries of the type:

{'quux': 2, 'baz': 'type 2', 'name': 'Frobulon'}


I've had a quick look at the ValuesQuerySet class and there seems to be a 
simple enough way to get this feature.  I'm presenting it in the form of a 
new ValuesQuerySet subclass and a monkey patch to the parent QuerySet. 
 It's not unlikely that it will break some things as this is my first peek 
into the QuerySet class.  I'd like to know if this is something that other 
people feel the need for and if it is worth pushing for inclusion of such a 
feature into django.

Cheers,

Arnaud



from django.db.models.query import QuerySet, ValuesQuerySet


class ValuesDictQuerySet(ValuesQuerySet):

def iterator(self):
# Purge any extra columns that haven't been explicitly asked for
extra_names = list(self.query.extra_select)
field_map = self.field_map
field_names = [field_map.get(fname, fname) for fname in 
self.field_names]
aggregate_names = list(self.query.aggregate_select)

names = extra_names + field_names + aggregate_names

for row in self.query.get_compiler(self.db).results_iter():
yield dict(zip(names, row))

def _clone(self, klass=None, setup=False, **kwargs):
c = super(ValuesDictQuerySet, self)._clone(klass, **kwargs)
c.field_map = self.field_map
return c


def QuerySet_values_dict(self, *field_list, **field_dict):
fields = list(field_list)
fields.extend(field_dict.values())
field_map = dict(zip(field_dict.values(), field_dict.keys()))
return self._clone(klass=ValuesDictQuerySet, setup=True, 
_fields=fields, field_map=field_map)


# Now we monkey-patch QuerySet with the new method
QuerySet.values_dict = QuerySet_values_dict

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/d4f8d6f0-3723-44d5-991a-9c6b3c13165d%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.