Re: Queryset composition query

2010-07-07 Thread Tom Evans
On Wed, Jul 7, 2010 at 5:06 PM, Jeff Green  wrote:
> When I combine two query sets I use the chain command. You might want to try
> it.
>
> Here is my code snippet
>
> from itertools import chain

chain is useful when you want to concatenate two lists together. In
this case though, I want distinct objects, ordered correctly by the
database server, which is what combining the querysets with the |
operator gives me.

I just still can't understand why this works:

qs = qs2 | qs1

and this does not:

qs = qs1 | qs2

and would prefer to understand so I can leave an appropriate comment
in the code for the next soul to touch this code, rather than a # XXX
HERE BE DRAGONS

Cheers

Tom

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



Re: Queryset composition query

2010-07-07 Thread Jeff Green
When I combine two query sets I use the chain command. You might want to try
it.

Here is my code snippet

from itertools import chain
# Get current station configuration records
stationlist =
StationConfig.objects.filter(StationId=result.StationId,
StartDate__lte= result.ExecutionStartDate,
EndDate__isnull=True)
# Get old station configuration records that fall within date
# range of test start date
stationlist2 =
StationConfig.objects.filter(StationId=result.StationId,
StartDate__lte= result.ExecutionStartDate,
EndDate__gte= result.ExecutionStartDate)
stationlist_total = list(chain(stationlist, stationlist2))
On Wed, Jul 7, 2010 at 9:10 AM, Tom Evans  wrote:

> Hi all
>
> I'm trying to combine two querysets, and having a difficult time
> explaining why one bit of code works, and why similar code doesn't.
> I'm probably doing something wrong..
>
> This is a customer management system:
> User objects are arranged into UserGroup objects, with a through table
> called UserUserGroupPreferences, which denote things about the User's
> membership of the UserGroup.
> UserGroup objects belong to a single Organization, and each
> Organization has exactly one UserGroup with is_catch_all_group=True.
>
> In simplified models, looks like this (User is django.contrib.auth.User)
>
> class UserUserGroupPreferences(models.Model):
>  usergroup = models.ForeignKey('UserGroup')
>  user = models.ForeignKey(User)
>  is_account_manager = models.BooleanField(default=False)
>
> class UserGroup(models.Model):
>  organization = models.ForeignKey('Organization')
>  users = models.ManyToManyField(User, through='UserUserGroupPreferences')
>  is_catch_all_group = models.BooleanField(default=False)
>
> I wish to find the groups for which a particular user is an account
> manager, or the catch all group in the same organization as a group of
> which the user is an account manager. I've come up with this bit of
> code, which works. However, I can't understand why the last line must
> be in that order.
>
> filt1 = Q(userusergrouppreferences__is_account_manager=True)\
>& Q(userusergrouppreferences__user=request.user)
> filt2 = Q(is_catch_all_group=True)\
>&
> Q(organization__usergroup__userusergrouppreferences__user=request.user)\
>&
> Q(organization__usergroup__userusergrouppreferences__is_account_manager=True)
> qs1 = UserGroup.objects.filter(filt1).distinct()
> qs2 = UserGroup.objects.filter(filt2).distinct()
> # For some reason, this is not the same as qs1 | qs2 - answers on a
> postcard please.
> managed_groups = qs2 | qs1
>
> Any hints?
>
> Cheers
>
> Tom
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To post to this group, send email to django-us...@googlegroups.com.
> To unsubscribe from this group, send email to
> django-users+unsubscr...@googlegroups.com
> .
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.



Queryset composition query

2010-07-07 Thread Tom Evans
Hi all

I'm trying to combine two querysets, and having a difficult time
explaining why one bit of code works, and why similar code doesn't.
I'm probably doing something wrong..

This is a customer management system:
User objects are arranged into UserGroup objects, with a through table
called UserUserGroupPreferences, which denote things about the User's
membership of the UserGroup.
UserGroup objects belong to a single Organization, and each
Organization has exactly one UserGroup with is_catch_all_group=True.

In simplified models, looks like this (User is django.contrib.auth.User)

class UserUserGroupPreferences(models.Model):
  usergroup = models.ForeignKey('UserGroup')
  user = models.ForeignKey(User)
  is_account_manager = models.BooleanField(default=False)

class UserGroup(models.Model):
  organization = models.ForeignKey('Organization')
  users = models.ManyToManyField(User, through='UserUserGroupPreferences')
  is_catch_all_group = models.BooleanField(default=False)

I wish to find the groups for which a particular user is an account
manager, or the catch all group in the same organization as a group of
which the user is an account manager. I've come up with this bit of
code, which works. However, I can't understand why the last line must
be in that order.

filt1 = Q(userusergrouppreferences__is_account_manager=True)\
& Q(userusergrouppreferences__user=request.user)
filt2 = Q(is_catch_all_group=True)\
& Q(organization__usergroup__userusergrouppreferences__user=request.user)\
& 
Q(organization__usergroup__userusergrouppreferences__is_account_manager=True)
qs1 = UserGroup.objects.filter(filt1).distinct()
qs2 = UserGroup.objects.filter(filt2).distinct()
# For some reason, this is not the same as qs1 | qs2 - answers on a
postcard please.
managed_groups = qs2 | qs1

Any hints?

Cheers

Tom

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.