无法分配“...”:"TestData.user" 必须是 "User" 实例

Cannot assign "...'": "TestData.user" must be a "User" instance

Django Rest Framework 的新手,希望能对此提供一些帮助。当我尝试使用适当的身份验证令牌在 Postman 中执行 POST 请求时,标题出现错误。

我已经创建了一个 table,我想向其发送 POST 请求,但在让用户 FK 被接受为列之一方面存在问题。请参阅下面的 model/serializer/view:

型号

class TestData (models.Model):
TestSDG = models.DecimalField(decimal_places=0, max_digits=2, default=0)
user = models.ForeignKey("auth.User", related_name="testdata", on_delete=models.CASCADE)

序列化器

class TestDataSerializer(serializers.ModelSerializer):

class Meta:
    model = TestData
    fields = ('id', 'TestSDG')

查看

@csrf_exempt
def testDataApi(request, id=0):
if request.method == 'GET':
    testdata = TestData.objects.all()
    testdata_serializer = TestDataSerializer(testdata,many=True)
    return JsonResponse(testdata_serializer.data,safe=False)
elif request.method == 'POST':
    testdata_data=JSONParser().parse(request)
    testdata_serializer=TestDataSerializer(data=testdata_data)
    if testdata_serializer.is_valid():
        testdata_serializer.save(user=request.user)
        return JsonResponse("Added Successfully", safe=False)

如果我不使用用户作为外键,POST 请求工作正常,我将 testdata_serializer.save(user=request.user) 改回 testdata_serializer.save(),但我想要 table 要求用户的 ID。

感谢任何帮助,谢谢。

您应该在 views.py 文件中使用 ModelViewset - 然后您可以覆盖序列化程序上的 update 方法:

views.py

from rest_framework.viewsets import ModelViewSet

class TestDataViewSet(ModelViewSet):
 
    queryset = TestData.objects.all()
    serializer_class = TestDataSerializer

serializers.py

class TestDataSerializer(serializers.ModelSerializer):

    ...

    def update(self, instance, validated_data):

        # get user id from validated data:
        user_id = validated_data.pop('user_id')

        # get user:
        user = User.objects.get(id=user_id)

        # set user on instance:
        instance.user = user
        instance.save()

        # continue with update method:
        super().update(instance, validated_data)

您提到您正在使用授权令牌。尝试在您的视图 testDataApi 中验证 request.user 是否使用 auth.User 对象正确设置。尝试使用类似下面的内容记录它,以确保它已正确设置为用户提供的令牌:

@csrf_exempt
def testDataApi(request, id=0):
    print(type(request.user), request.user)  # Should display the user for the provided token.
    ...

如果未设置,则您必须配置它如何从提供的令牌正确映射 auth.User 对象。您可能需要查看以下内容: