Из документов Django :
Менеджер - это интерфейс, через который предоставляются операции запросов к базе данных для моделей Django
Таким образом, менеджер не является способом создания новых экземпляров модели.
Я бы просто имел конструктор для модели Group
, который извлекает User
(если он задан) из аргументов ключевого слова и создает новый UserGroup
.
Таким образом, если вы создали новый Group
как Group(name='group name', user=some_user)
, конструктор мог бы убрать аргумент ключевого слова user
и создать соответствующий UserGroup
с этим user
:
class Group(models.Model):
name = models.CharField(max_length=200)
def __init__(self, *args, **kwargs):
# Remove user from the kwargs.
# It is important that user is removed from the kwargs before calling
# the super.__init__(). This is because the `user` kwarg is not expected.
user = kwargs.pop('user', None)
# call the normal init method
super(Group, self).__init__(*args, **kwargs)
# Create the UserGroup instance for the specified user
if user is not None:
# Maybe some other logic here ...
UserGroup(user=user, group=self).save()
Таким образом, если вы предоставите user
при создании экземпляра Group
, он создаст UserGroup
и не будет ничего делать в противном случае.
Конечно, вы могли бы сделать то же самое в конструкторе модели UserGroup
, это не так уж важно, это просто зависит от того, что метафорически имеет смысл для вашего кода.
EDIT:
Исправление проблем, указанных в комментариях:
...
def __init__(self, *args, **kwargs):
...
self._user_group = UserGroup(user=user, group=self)
def save(self, *args, **kwargs):
super(Group, self).save(*args, **kwargs)
self._user_group.save()