django obtain related manager with unknown name -
trying make app reusable , compatible custom user models, i've encountered following issue:
let's user model following:
class member(abstractuser): pass # builtin user name
as result of code django.contrib.auth.models
:
class permissionsmixin(models.model): """ mixin class adds fields , methods necessary support django's group , permission model using modelbackend. """ is_superuser = models.booleanfield(_('superuser status'), default=false, help_text=_('designates user has permissions without ' 'explicitly assigning them.')) groups = models.manytomanyfield(group, verbose_name=_('groups'), blank=true, help_text=_('the groups user belongs to. user ' 'get permissions granted each of ' 'his/her group.')) user_permissions = models.manytomanyfield(permission, verbose_name=_('user permissions'), blank=true, help_text='specific permissions user.') class abstractuser(abstractbaseuser, permissionsmixin): # <- included there ....
(notice many many groups
doesn't define related_name
.)
now, when working groups can't this:
group.user_set.add(...)
because reverse relatedmanager
name member_set
.
note the model's name member
in case other.
right now, i'm doing following:
getattr(group, "%s_set" % settings.auth_user_model.split('.')[-1].lower())
yeah, quite ugly.
question: common or bultin solution this?
edit final implementation:
@classmethod def _get_user_reverse_field_name(cls): user = get_user_model() cls._user_reverse_field_name = user._meta.get_field('groups').related.get_accessor_name() @property def members(self): if not hasattr(self, '_user_reverse_field_name'): self._get_user_reverse_field_name() return getattr(self, self._user_reverse_field_name)
this should looking for:
in [1]: opts = group._meta in [2]: django.contrib.auth import get_user_model() in [3]: rel = [r r in opts.get_all_related_many_to_many_objects() if r.model == get_user_model()] in [4]: rel out[4]: [<relatedobject: users:user related groups>] in [5]: user_rel = rel[0] in [6]: user_rel.get_accessor_name() out[6]: 'user_set'
Comments
Post a Comment