Добавить объект в поле ManyToMany с помощью CreateModelMixin.create () - PullRequest
0 голосов
/ 08 октября 2018

Я использую mixins.CreateModelMixin.create для создания объекта, но также мне нужно добавить request.user к m2m полям в нем.Поэтому моя идея состоит в том, чтобы поймать объект из self.create(), а затем из-за make obj.users.add(user).Но CreateModelMixin возвращает только responce.Как я могу получить объект от .create?Это лучший способ добавить пользователя?Могу ли я использовать super (не очень хорошо)?Спасибо!

ДОБАВЛЕНО:

Я могу использовать perform_create() и ловить объект здесь, но это делает код больше и повторяет .create() в основном, поэтому я недумаю, что это правильный путь.

ДОБАВЛЕНО:

Код I пользователь сейчас:

@action(detail=False, methods=['POST'], serializer_class=CompanyAdminSerializer)
def create_company(self, request):
    user = self.request.user
    if user.user_of_company.exists():
        raise NotAcceptable(detail='Only one company allowed')
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    company = serializer.save()
    company.users.add(user)
    company.admin_users.add(user)
    return Response(serializer.data)

1 Ответ

0 голосов
/ 08 октября 2018

Чтобы поймать экземпляр из create, вам придется переопределить метод create.Простейшим способом было бы переопределить метод perform_create.

.save() возвращает экземпляр созданного объекта. source

Ваш код будет выглядеть следующим образом:

#Assuming you're using CreateAPIView
class New_Create(CreateAPIView):
    def perform_create(self, serializer):
        obj = serializer.save()
        #Adding to M2M
        obj.users.add(self.request.user)

Сериализаторы DRF не поддерживают M2M создания / обновления из коробки.

РЕДАКТИРОВАТЬ: я не рекомендую переопределять метод create.Метод perform_create был создан именно для этой цели.Вы можете получить доступ к экземпляру только после вызова .save().Таким образом, после вызова .save() на сериализаторе вы можете обновить экземпляр так, как вы хотите.Доступ к экземпляру возможен двумя способами: 1) Использовать объект, возвращаемый методом .save (как показано выше). 2) Вы можете использовать serializer.instance.(Опять же, вы можете получить доступ к instance только после вызова .save.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...