You are awesome! Thank you! On Friday, 22 July 2016 21:41:58 UTC+1, Todor Velichkov wrote: > > Hello, I don't think sub-classing `Func` would be appropriate here. A much > easier way would be to use `RawSQL > <https://docs.djangoproject.com/en/1.8/ref/models/expressions/#raw-sql-expressions> > ` > > since you want to dynamically check for different group you could write a > factory method to build `RawSQLs` for you, something like: > > from django.db.models import BooleanField > from django.db.models.expressions import RawSQL > > def build_has_group_raw_sql(group_name): > return RawSQL("""EXISTS( > SELECT 1 FROM `auth_group` > WHERE `auth_group`.`name` = %s > AND `auth_group`.`id` IN ( > SELECT `auth_user_groups`.`group_id` > FROM `auth_user_groups` > WHERE `auth_user_groups`.`user_id` = `auth_user`.`id` > ) > )""", (group_name,), output_field=BooleanField()) > > Now you can use this function as follows: > > User.objects.all().annotate(is_customer=build_has_group_raw_sql('customer' > )) > > > On Friday, July 22, 2016 at 7:01:08 PM UTC+3, mishbah wrote: >> >> Given that I have a django model that has a ForeignKey that is linked to >> itself. >> >> class DjangoModel(): >> >> [...] >> >> successor = models.ForeignKey('self', null=True) >> >> I was able to write a custom django database function like this: >> >> from django.db.models import BooleanField >> from django.db.models import Func >> >> >> class IsNull(Func): >> """ >> See docs: >> https://docs.djangoproject.com/en/1.8/ref/models/database-functions/ >> """ >> template = '%(expressions)s IS NULL' >> >> def __init__(self, *args, **kwargs): >> kwargs['output_field'] = BooleanField() >> super(IsNull, self).__init__(*args, **kwargs) >> >> So I can do this: >> >> queryset = DjangoModel.objects.all() >> queryset = queryset.annotate(**{'is_latest': IsNull('successor')}) >> >> and if use `queryset.values()` .. I get >> >> [{'pk': 1, is_latest': True}, {'pk': 2, 'is_latest': False}, ] >> >> where `is_latest == True` when `successor` field is NULL for an object. >> >> Now I want to do something similar, but have no idea where to start! >> >> The bundled `django.contrib.auth.models.User` has a ManyToMany relations >> to `django.contrib.auth.models.Group` model >> >> For my project, there are multiple user group types, e.g customer / >> marketing / finance etc >> >> What I want to do.. is annotate a `User` queryset with `is_FOO` field >> where `FOO` is a group name. e.g `is_customer` or `is_marketing` >> >> So if I use `.values()` on a queryset, I should get something like this: >> >> [{'pk': 1, 'is_customer': True, 'is_marketing': False }, {'pk': 1, >> 'is_customer': True, 'is_marketing': True }] >> >> The group name could be hardcoded, e.g >> >> queryset.annotate(**{'is_customer': IsGroupMember('customer')}) >> >> I just need help with the `IsGroupMember` database function! >> >> Is that even possible? Any hints or tips to get me started? >> >> Any help will be genuinely appreciated. Many Thanks >> >
-- 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 [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/eacf185a-b1ed-4e05-af84-1bd58626c775%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

