A Пользователь принадлежит к Офис. A Пользователь может создать Контакт. A Контакт относится к офису .Django Rest Framework: по умолчанию внешний ключ для значения по запросу
Я хочу, чтобы office_id Contact по умолчанию был в текущем офисе пользователя.
На данный момент, как я делаю это с помощью переопределения ModelViewSet создать метод:
В моем views.py
def create(self, request):
contact_data = request.data
contact_data['office'] = request.user.userprofile.office.id # This is the only line I added
serializer = self.get_serializer(data=contact_data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
Но этот подход не чувствует себя совершенно правильно, и это много кода для того, что он делает. Любая идея о том, как я могу достичь этого лучше?
Привет Todor, спасибо за Ваш ответ. Я выбрал второе решение (почувствовал себя чище для меня). Не могли бы вы объяснить «возврат супер (ViewClassName, self) .create (request, * args, ** kwargs)« бит? Я знаю, что супер в ООП, но здесь он выглядит как рекурсивная функция ...? – MonsieurNinja
Каждый класс 'child' может иметь доступ к своим« родительским »методам. 'super (YourViewClassName, self)' возвращает 'parent' вашего класса' ViewSet'. Поэтому после внесения необходимых изменений мы используем его (родительский) для вызова метода 'create' * (parent.create) * для выполнения оставшейся работы. Хм, надеюсь, это объяснит? Если еще не ясно, прочитайте некоторые статьи по теме, например, начните с этого: [Наследование Versus Composition] (http://learnpythonthehardway.org/book/ex44.html) – Todor
Это имеет смысл, спасибо за вашу помощь! – MonsieurNinja