我在django中的序列化程序类上定义更新方法时遇到问题。这是我的基本模式
class Category(models.Model):
category = models.CharField(max_length = 100)
def __str__(self):
return self.category
class Items(models.Model):
category = models.ForeignKey(Category)
item = models.CharField(max_length = 100)
rate = models.DecimalField(max_digits = 20,decimal_places =2)
def __str__(self):
return self.item
以下是我的序列化器:
class ItemSerializer(serializers.ModelSerializer):
category = serializers.CharField(source = 'category.category',read_only = True)
category_pk = serializers.IntegerField(source = 'category.pk')
class Meta:
model = Items
fields = ('pk','category','category_pk','item','rate',)
def update(self,instance,validated_data):
category_pk = validated_data.get('category_pk',instance.category_pk)
instance.category = Category.objects.get(pk = category_pk)
instance.item = validated_data.get('item',instance.item)
instance.rate = validated_data.get('rate',instance.rate)
instance.save()
return instance
我在使用AJAX的PUT方法时遇到错误,说明Item对象没有category_pk字段(但我不在instance.save()方法中包含它)
下面的是我的AJAX请求
$('#update-item').on('click',function(){
var dat = {
'category':$("#category-box").find('option[value='+cat_pk+']').text(),
'category_pk':$('#category-box').val(),
'item':$('#Items').val(),
'rate':$('#Rate').val()
};
console.log(dat);
$.ajax({
type : 'PUT',
url: 'http://127.0.0.1:8000/billing/items/'+pk+'/',
data : JSON.stringify(dat),
contentType: 'application/json',
crossDomain:true,
success : function(json){
alert('ok');
},
error : function(json){
alert('error with PUT')
}
});
});
我忽略了更新方法,因为休息框架错误地指出它无法写入嵌套字段。
KJ
答案 0 :(得分:0)
默认情况下,DRF会将pk用于ModelSerializer上的类别字段,但在您的情况下,您将类别字段设置为read_only = True,并且您的模型上没有category_pk字段。我会像这样更改序列化程序,然后将pk发布到category字段而不是category_pk字段。然后,您还可以删除更新方法覆盖。
class ItemSerializer(serializers.ModelSerializer):
# I assume you changed the category field to readonly to display the text of the category
category_name = serializers.ReadOnlyField(source='category.category')
class Meta:
model = Items
fields = ('pk','category','category_name','item','rate',)