python - 输入请求时输入错误 Django Rest Framework
问题描述
我正在构建一个 Django 应用程序,其中有一个名为 Location 的模型和另一个名为 Property 的模型。每当我尝试发出 put 请求时,它都会显示我的类型错误TypeError: Object of type Location is not JSON serializable
我的位置模型
class Location(models.Model):
lat = models.DecimalField(max_digits=10,decimal_places=8)
long = models.DecimalField(max_digits=10,decimal_places=8)
address = models.CharField(max_length=256)
class Property(models.Model):
owner = models.OneToOneField(to=User,on_delete=models.CASCADE)
name = models.CharField(max_length=256)
bedrooms = models.SmallPositiveIntigerField()
bathrooms = models.SmallPositiveIntigerField()
living_rooms = models.SmallPositiveIntigerField()
location = models.ForeignKey(to=Location,null=True,on_delete=models.SETNULL)
串行器
class PropertySerializer(serializers.ModelSerializer):
class Meta:
model = Property
fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
read_only_fields = ['id']
class LocationSerializer(serializers.ModelSerializer):
class Meta:
model = Location
fields = ['id','long','lat','address']
read_only_fields = ['id']
意见
class RenterCreate(APIView):
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated, RenterPermission]
renderer_classes = [JSONRenderer]
def get(self, request):
property = Property.objects.all()
serializer = RenterSerializer(property , many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
serializer = PropertySerializer(data=request.data)
if serializer.is_valid():
serializer.save(user=request.user)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.error_messages, status=status.HTTP_400_BAD_REQUEST)
def put(self, request):
serializer = PropertySerializer(request.user, data=request.data)
if serializer.is_valid():
serializer.save(user=request.user)
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
当我使用 PUT 请求更新它向我显示的信息时保存属性后,我
TypeError: Object of type Location is not JSON serializable
在数据库中保存了几个位置。首先我用它发出了一个帖子请求,它给了我STATUS 201 CREATED
{
'name': 'foo',
'bedrooms':4,
'bathrooms':3,
'living_rooms':5,
'location':4,
}
然后我对它做一个 put 请求
{
'name': 'foo bar',
'bedrooms':1,
'bathrooms':2,
'living_rooms':2,
'location':1,
}
它给了我TypeError: Object of type Location is not JSON serializable
解决方案
在您的“位置”属性中,PropertySerializer
您需要添加一个PrimaryKeyRelatedField
或:LocationSerializer
class PropertySerializer(serializers.ModelSerializer):
location = PrimaryKeyRelatedField()
class Meta:
model = Property
fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
read_only_fields = ['id']
或者:
class PropertySerializer(serializers.ModelSerializer):
location = LocationSerializer()
class Meta:
model = Property
fields = ['id','name','bedrooms','bathrooms','living_rooms','location']
read_only_fields = ['id']
我相信在 RenterCreate 视图中也有一种方法可以做到这一点,但如果其中任何一个先工作,请告诉我。
推荐阅读
- javascript - 我应该继续使用对象而不是类吗?JSDocs 的一些问题
- google-cloud-platform - 从 Google Cloud Datastore 导出将关键属性上的应用程序 ID 设置为 b~
. 这使得导入不可用 - c# - 在 WPF 中设置 CurrentCulture 和 CurrentUICulture
- python - 使用 autograd 进行优化
- circuit-sdk - 如何使用我的 USB 耳机为 Circuit Client 开发接口应用程序以支持呼叫控制功能?
- office365 - “读取 TLS 记录失败 (2)” 使用 Chilcat ActiveX 连接到 office365 IMAP
- java - Hibernate - 基类外键
- swift - 如何在 Xcode 中调试“前提条件失败”?
- python - Flask 中重复的关键字参数
- sql - 使用 SQL 正则表达式验证字符串