2015-04-23 2 views
0

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) 

Но этот подход не чувствует себя совершенно правильно, и это много кода для того, что он делает. Любая идея о том, как я могу достичь этого лучше?

ответ

1

Вы можете зацепить .perform_create:

def perform_create(self, serializer): 
    serializer.save(office=self.request.user.userprofile.office.id) 

но вы, возможно, придется также изменить office поле в serializer к required=False для того, чтобы сделать его пройти .is_valid.

Другим решением является изменение request.data и затем вызвать метод create:

def create(self, request, *args, **kwargs): 
    request.data['office'] = request.user.userprofile.office.id 
    return super(ViewClassName, self).create(request, *args, **kwargs) 
+0

Привет Todor, спасибо за Ваш ответ. Я выбрал второе решение (почувствовал себя чище для меня). Не могли бы вы объяснить «возврат супер (ViewClassName, self) .create (request, * args, ** kwargs)« бит? Я знаю, что супер в ООП, но здесь он выглядит как рекурсивная функция ...? – MonsieurNinja

+0

Каждый класс 'child' может иметь доступ к своим« родительским »методам. 'super (YourViewClassName, self)' возвращает 'parent' вашего класса' ViewSet'. Поэтому после внесения необходимых изменений мы используем его (родительский) для вызова метода 'create' * (parent.create) * для выполнения оставшейся работы. Хм, надеюсь, это объяснит? Если еще не ясно, прочитайте некоторые статьи по теме, например, начните с этого: [Наследование Versus Composition] (http://learnpythonthehardway.org/book/ex44.html) – Todor

+0

Это имеет смысл, спасибо за вашу помощь! – MonsieurNinja

Смежные вопросы