Django rest_framework序列化器忽略POST数据

时间:2014-07-17 23:08:13

标签: django django-rest-framework

我有一个序列化器:

class InterestSerializer(serializers.ModelSerializer):
    category = serializers.RelatedField()

    class Meta:
        model = Importance
        fields = ('id', 'category', 'is_important')

为模型:

class Importance(models.Model):
    profile = models.ForeignKey("Profile")
    category = models.ForeignKey(InterestCategory)
    is_important = models.BooleanField(default=True)

    class Meta:
        unique_together = ('profile', 'category')

    def __unicode__(self):
        return self.category.name

我通过ajax进行简单的POST来更新模型。我可以确认发布的数据是否正确:

POST:
csrfmiddlewaretoken = u'ts0PEgLZIqkeOXp2a7z8Ex5eSbvGFOi3'
is_important = u'False'
id = u'2'

但是,如果我检查序列化中的数据,则会有所不同:

if request.method == "POST":
        serializer = InterestSerializer(data=request.DATA)
        if serializer.is_valid():
            print serializer.data

在终端

{'id': None, 'category': None, 'is_important': False}

为什么不将id(pk)加载到序列化数据中?

编辑:

      <form id="{{ interest.pk }}">{% csrf_token %}
        <input type='hidden' name='id' value='{{ interest.pk }}'>
        <label class="radio-inline">
          <input type="radio" name="is_important" value="True"> Use 
        </label>
        <label class="radio-inline">
          <input type="radio" name="is_important" value="False"> Don't Use 
        </label>
      </form>

<script>
  $('input[type=radio]').click(function() {
    $.post("/api/categories", ($(this).closest("form").serialize()));
  });
</script>

2 个答案:

答案 0 :(得分:0)

Django将忽略您的id参数。 id字段是自动增量主键,仅在保存对象后才可用。您的代码应该像这样改变:

if request.method == "POST":
    serializer = InterestSerializer(data=request.DATA)
    if serializer.is_valid():
        serializer.save()
        print serializer.data

答案 1 :(得分:0)

我知道它有几年了,但无论如何我都会回答。

要进行更新,您实际上必须这样做:

InterestSerializer(instance=<instance to update>, data=<data dict>)

重要的是,我们无需在请求正文中设置id

关于500状态代码,您必须向我们展示更多详细信息,例如显示的消息,追溯等。