django modelViewSet中的重载更新方法

时间:2015-09-28 13:15:31

标签: python ajax django django-rest-framework

我在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

1 个答案:

答案 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',)