Python 在Django REST中自动设置POST上的用户id

Python 在Django REST中自动设置POST上的用户id,python,django,django-rest-framework,django-rest-auth,Python,Django,Django Rest Framework,Django Rest Auth,我正在尝试使用Django REST发布一个“记录”。我希望Django自动设置登录用户的用户id views.py: class ItemViewSet(viewsets.ModelViewSet): queryset = Item.objects.all() serializer_class = ItemSerializer def perform_create(self, serializer): serializer.save(owner=sel

我正在尝试使用Django REST发布一个“记录”。我希望Django自动设置登录用户的用户id

views.py:

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

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
class MyUser(EmailAbstractUser):
    date_of_birth = models.DateField('Date of birth', null=True, blank=True)
    objects = EmailUserManager()
def pre_save(self, obj):
    obj.owner = self.request.user
serializers.py:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'created', 'owner', 'desc')
        read_only_fields = ('owner',)
owner = serializers.Field(source='owner.id')
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='')
我正在使用django rest authemail 0.1.4中的EmailAbstractUser:

views.py:

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

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
class MyUser(EmailAbstractUser):
    date_of_birth = models.DateField('Date of birth', null=True, blank=True)
    objects = EmailUserManager()
def pre_save(self, obj):
    obj.owner = self.request.user

非常感谢您的帮助。

您可以覆盖ItemViewSet中的“执行创建”方法,如下所示:

def perform_create(self, serializer):
    return serializer.save(owner=self.request.user)
如果要将此属性设置为请求用户,则仅在创建时设置,现在即可设置。
但是,如果您也想在更新时重新设置所有者,您也必须覆盖执行更新方法(以相同的方式)。

您可以覆盖ItemViewSet中的执行创建方法,如下所示:

def perform_create(self, serializer):
    return serializer.save(owner=self.request.user)
如果要将此属性设置为请求用户,则仅在创建时设置,现在即可设置。
但是,如果您也想在更新时重新设置所有者,您也必须覆盖perform_update方法(以相同的方式)。

好的,我自己解决了这个问题:

在serializers.py中的ItemSerializer中:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'created', 'owner', 'desc')
        read_only_fields = ('owner',)
owner = serializers.Field(source='owner.id')
在models.py中的项中

owner = models.ForeignKey(MyUser)
在views.py中的ItemViewSet中:

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

好的,我自己解决了这个问题:

在serializers.py中的ItemSerializer中:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'created', 'owner', 'desc')
        read_only_fields = ('owner',)
owner = serializers.Field(source='owner.id')
在models.py中的项中

owner = models.ForeignKey(MyUser)
在views.py中的ItemViewSet中:

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

您必须首先使用request.users设置用户的实例这些只是您的模型-您的发布代码在哪里?当我尝试发布时,它告诉我我需要明确设置所有者id,所以问题不在POST AFAIK中。你必须首先使用请求设置用户的实例。users这些只是你的模型-你的发布代码在哪里?当我尝试发布时,它告诉我我明确需要设置所有者id,所以问题不在POST AFAIK中。嗨,我将其添加到我的ItemViewSet中尝试此操作,但仍然会得到“owner\u id不能为null”。我已经更改了上面的代码以反映这一点。您应该向视图集中添加一个权限类,该类强制用户通过身份验证才能访问它。否则,self.request.user可能是匿名用户…您好,我已将此添加到我的ItemViewSet尝试此操作,但仍然会得到“owner\u id不能为null”。我已经更改了上面的代码以反映这一点。您应该向视图集中添加一个权限类,该类强制用户通过身份验证才能访问它。否则,self.request.user可能是匿名用户。。。