2015-06-01 2 views
0

Я пытаюсь выполнить POST «запись» с помощью Django REST. Я хочу, чтобы Django автоматически установил идентификатор пользователя из зарегистрированного пользователя.Установка идентификатора пользователя автоматически в POST в Django REST

views.py:

class ItemViewSet(viewsets.ModelViewSet): 
    queryset = Item.objects.all() 
    serializer_class = ItemSerializer 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

serializers.py:

class ItemSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Item 
     fields = ('id', 'created', 'owner', 'desc') 
     read_only_fields = ('owner',) 

models.py:

class Item(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    owner = models.ForeignKey('appserver.MyUser', related_name='appserver') 
    desc = models.CharField(max_length=100, blank=True, default='') 

Я использую EmailAbstractUser от Джанго-покоя authemail 0.1.4 :

views.py:

class MyUser(EmailAbstractUser): 
    date_of_birth = models.DateField('Date of birth', null=True, blank=True) 
    objects = EmailUserManager() 

Любая помощь приветствуется.

+1

Вы должны сначала установить th e пользователь пользователя, использующий request.user – Abhishek

+0

, это ваши модели - где ваш POST-код? – professorDante

+0

Когда я пытаюсь опубликовать его, он говорит мне, что я явно должен установить owner_id, поэтому проблема не в самом POST AFAIK. – Henrik

ответ

3

Вы можете перезаписать perform_create метод в ItemViewSet, что-то вроде этого:

def perform_create(self, serializer): 
    return serializer.save(owner=self.request.user) 

Если вы хотите установить этот атрибут для запрашивающего пользователя, только во время создания, вы будете теперь ее. Но если вы хотите снова установить владельца на время обновления, вам также придется перезаписать метод perform_update (таким же образом).

+0

Привет, я добавил это в свой ItemViewSet, но все равно получает «owner_id не может быть null». Я изменил свой код выше, чтобы отразить это. – Henrik

+1

Вы должны добавить класс разрешений к вашему представлению, который принуждает пользователя пройти аутентификацию для доступа к нему. В противном случае self.request.user может быть анонимным пользователем ... – suselrd

0

ОК я на самом деле решил это сам:

В ItemSerializer в serializers.py:

owner = serializers.Field(source='owner.id') 

В пункте в models.py

owner = models.ForeignKey(MyUser) 

В ItemViewSet в views.py:

def pre_save(self, obj): 
    obj.owner = self.request.user 

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

  • Нет связанных вопросов^_^