Django Rest FrameWork 使用用户外键添加模型

Django Rest FrameWork Add Model With User Foreign Key

我正在使用 Django 版本 3 和 Rest 框架,我有一个带有用户外键的模型。
所以每次保存模型时,用户也需要保存。
为了能够通过 rest 添加或编辑模型,您需要使用令牌身份验证进行身份验证。
我正在使用 ClassBasedViews,问题是我找不到添加模型的方法,因为在我的序列化程序中,字段用户被排除在外,因为我不希望它是可编辑的。

models.py:

class Chambre(models.Model):
    local_id=models.PositiveIntegerField(unique=True)
    nom=models.CharField(max_length=255)
    user=models.ForeignKey(User,on_delete=models.CASCADE,blank='true')

    class Meta:
        unique_together = ('local_id', 'user',)

serializers.py:

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',] 

views.py:

class ChambreListApi(APIView):
"""
List all chambres, or create a new chambre.
"""
    authentication_classes=(TokenAuthentication,)
    permission_classes=(IsAuthenticated,)


    def get(self, request, format=None):
        chambres = Chambre.objects.filter(user=request.user)
        serializer = ChambreSerializer(chambres, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = ChambreSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(commit=False)
            serializer.user=request.user
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

尝试将设置用户的逻辑移至序列化程序。默认情况下,GenericAPIView 将通过上下文将请求传递给序列化程序。

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',]

    def create(self, validated_data):
        validated_data["user"] = self.context["request"].user
        return super().create(validated_data)

感谢您的回复非常有用,我已经通过向 serializer.py 添加方法解决了这个问题:

class ChambreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Chambre
        exclude =['user',]


    def set_the_user(self,request):
        self.user=request.user

    def create(self, validated_data):
        validated_data["user"] = self.user
        return super().create(validated_data)  

并在 views.py 中:

def post(self, request, format=None):
    serializer = ChambreSerializer(data=request.data)
    serializer.set_the_user(request)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我遵循 schillingt 发布的公认解决方案时,我必须在实例化序列化程序时添加 context={'request': request}。 Django REST Framework 文档提到向序列化程序添加上下文 here.

serializers.py

class NoteCreateSerializer(serializer.ModelSerializer):
    class Meta:
        model = Note
        exclude = ['owner',]

    def create(self, validated_data):
        validated_data['owner'] = self.context['request'].user
        return super().create(validated_data)

views.py

@api_view['POST']
def create_note(request):
    note_serializer = NoteCreateSerializer(
        data = request.data,
        context = {'request': request} # this will populate 'self.context' 
                                       # in the serializer instance
    ) 
    
    # ... 

非常感谢这个解决方案!它结束了长达数小时的斗争。