Попытка сделать мое приложение для повторного использования и совместимы с моделями, созданные пользователем, я столкнулся следующий вопрос:Джанго получить соответствующий менеджер с неизвестным именем
Скажем, модель пользователя имеет следующий вид:
class Member(AbstractUser):
pass # basically the builtin User with another name
в результате этого кода из django.contrib.auth.models
:
class PermissionsMixin(models.Model):
"""
A mixin class that adds the fields and methods necessary to support
Django's Group and Permission model using the ModelBackend.
"""
is_superuser = models.BooleanField(_('superuser status'), default=False,
help_text=_('Designates that this user has all permissions without '
'explicitly assigning them.'))
groups = models.ManyToManyField(Group, verbose_name=_('groups'),
blank=True, help_text=_('The groups this user belongs to. A user will '
'get all permissions granted to each of '
'his/her group.'))
user_permissions = models.ManyToManyField(Permission,
verbose_name=_('user permissions'), blank=True,
help_text='Specific permissions for this user.')
class AbstractUser(AbstractBaseUser, PermissionsMixin): # <- included there
....
(Обратите внимание на то, что многие ко многим groups
не определяет.)
Теперь при работе с группами я не могу это сделать:
group.user_set.add(...)
так как обратное RelatedManager
имя на самом деле member_set
.
Обратите внимание, что в данном случае имя модели Member
, но это может быть любой другой.
Прямо сейчас, я делаю следующее:
getattr(group, "%s_set" % settings.AUTH_USER_MODEL.split('.')[-1].lower())
Да, очень некрасиво.
Вопрос: Любое общее решение или решение bultin для этого?
EDIT с моей окончательной реализацией:
@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)
Ahh, я неправильно понял вопрос, удалил свой ответ ... – Ngenator