无法分配“...”:"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
对象。您可能需要查看以下内容:
- AuthenticationMiddleware - 设置
request.user
对象。
- AUTHENTICATION_BACKENDS - 令牌的自定义身份验证,然后 return 关联的
auth.User
对象
- DEFAULT_AUTHENTICATION_CLASSES - 仅当使用
djangorestframework
时。设置 request.user
对象。
- TokenAuthentication, JSONWebTokenAuthentication,等等 - 仅当使用
djangorestframework
时。一些验证令牌的实现。也许它们没有正确配置。
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
对象。您可能需要查看以下内容:
- AuthenticationMiddleware - 设置
request.user
对象。 - AUTHENTICATION_BACKENDS - 令牌的自定义身份验证,然后 return 关联的
auth.User
对象 - DEFAULT_AUTHENTICATION_CLASSES - 仅当使用
djangorestframework
时。设置request.user
对象。- TokenAuthentication, JSONWebTokenAuthentication,等等 - 仅当使用
djangorestframework
时。一些验证令牌的实现。也许它们没有正确配置。
- TokenAuthentication, JSONWebTokenAuthentication,等等 - 仅当使用