Django rest框架序列化程序无法保存模型实例
我正在使用DRF。 My models.py:Django rest框架序列化程序无法保存模型实例,django,django-rest-framework,Django,Django Rest Framework,我正在使用DRF。 My models.py: class Farm(models.Model): farmer = models.ForeignKey(User, verbose_name="Farmer of this farm") name = models.CharField(max_length=15, blank=False, verbose_name="Farm name", help_text="Please give a single word name for
class Farm(models.Model):
farmer = models.ForeignKey(User, verbose_name="Farmer of this farm")
name = models.CharField(max_length=15, blank=False, verbose_name="Farm name", help_text="Please give a single word name for your farm.")
address = models.TextField(help_text="Please provide the address without the postal code", blank=False,)
postal_code = models.CharField(max_length=5, blank=False, default='12043')
size = models.DecimalField(max_digits=9, decimal_places=6, blank=False, )
#To add user's full name in the admin interface for better readability
def get_farmer_full_name(self):
return self.farmer.get_full_name()
#Works like a verbose_name but for a method
get_farmer_full_name.short_description = 'Farmers full name'
My serializers.py:
class FarmSerializer(serializers.ModelSerializer):
class Meta:
model = Farm
fields = ('farmer', 'name', 'address', 'postal_code', 'size')
def create(self, validated_data):
return Farm.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.address = validated_data.get('address', instance.address)
instance.postal_code = validated_data.get('postal_code', instance.postal_code)
instance.size = validated_data.get('size', instance.size)
instance.save()
return instance
My views.py:
@api_view(('POST',))
def addFarm(request):
data = JSONParser().parse(request)
farmer = Farm(farmer = request.user)
serializer = FarmSerializer(farmer, data=data)
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)
当我点击url(r'^farms/save/$,views.addFarm),
这个url时,我想用请求中提供的参数保存一个新的服务器场实例。我正在使用邮递员发送请求
但是,我得到了{“farmer”:[“此字段是必需的。”],“name”:[“此字段是必需的。”],“address”:[“此字段是必需的。”],“size”:[“此字段是必需的。”]}
错误作为响应
我的请求如下所示:
注意:我不能将第一个字段“farmer”作为参数发送,但我想我必须使用request.user.id
提取它并以独占方式传递它,但我不确定
我做错了什么?如何修复此问题?在views.py中更改此问题
data = {"farmer": request.user.id}
data.update(request.data)
serializer = FarmSerializer(data=data)
或者根据您的编辑
data = JSONParser().parse(request)
data.update({"farmer": request.user.id})
serializer = FarmSerializer(data=data)
你能发布request.data的输出吗?它看起来像这样:{u'size':u'123.56',u'postal_code':u'12034',u'name':u'Lisa',u'address':u'lichtenau'}:在postman中,我选择了Raw和Json并传递了{“name”:“Lisa”,“address”:“lichtenau”,“postal_code”:“12034”,“size”:“123.56”},为此,我得到了农民的回应,说这片土地是必需的。如果在视图中将此项更改为
farmer=Farm(farmer\u id=request.user)
则print(serializer.is\u valid())打印错误。。输出是一样的吗?啊,我在问题中忘了更新,已经是这样了。我更新了Question中的视图,效果很好!谢谢!这是在DRF中保存数据的标准方式吗?我对DRF比较陌生,之前我使用的表单对DRF来说是一个无用的选项。是否可以扩展此功能以更新场?是否对声明的字段元组进行有效的函数检查,并且您没有在数据中发送farmer密钥。是正确的!我也可以用它来更新。你的回答帮助很大。