【问题标题】:Cannot deserialize object in django rest framework无法在 django rest 框架中反序列化对象
【发布时间】:2014-01-26 13:24:57
【问题描述】:

我正在仔细阅读http://www.django-rest-framework.org/api-guide/serializers 并尝试实现一个基本的反序列化器。我有点困惑,因为我的实验代码导致随机结果毫无意义。

我有一个简单的 django 模型:

class ArticleType(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=15)

class Article(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=80)
    body = models.TextField()
    featured = models.BooleanField(default=False)
    published = models.BooleanField(default=False)
    children = models.ManyToManyField('self')
    article_type = models.ForeignKey(ArticleType)

我有一个简单的反序列化器:

class ArticleSerializer(ModelSerializer):

    article_type = serializers.CharField(max_length=15)
    children = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:

        model = Article
        fields = ('id', 'featured','published','body','title','children','article_type')

在 django shell 中,我运行以下命令:

>>> aData = {'id':3,'featured':True,'published':True, 'body':'This is some body text!', 'title':'This is a title!', 'children':[2,3], 'article_type':'Topic'}
>>> aS = ArticleSerializer(data=aData)

产量:

>>> aS.is_valid() 
True
>>> aS.data
{'featured': False, 'published': False, 'body': u'', 'title': u'', 'children': [], 'a_type': u''}

从这里我有几个问题。

  1. 为什么要更改数据?

  2. 如果数据无效,为什么.is_valid()方法返回true?

  3. 文档没有明确说明我将在何处实现从长度为 15 的 CharField 到在我的 article_type 字段中实际返回 ArticleType 实例的转换。

注意:文章表中填充了一些虚拟文章。

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    数据没有改变。这些是模型中指定的默认值。是您的序列化程序定义导致 .is_valid 返回 true。

    我想你想这样定义它:

    class ArticleTypeSerializer(serializers.ModelSerializer):
        model = models.ArticleType
        fields= ('id', 'name',)
    
    class ArticleSerializer(serializers.ModelSerializer):
    
        article_type = ArticleTypeSerializer
    
        class Meta:
            model = models.Article
            fields = ('id', 'featured','published','body','title','children','article_type',)
    

    另外,我很确定您想将blank=True 添加到您对模型中孩子的定义中,否则每篇文章都有孩子,有孩子,有孩子,无止境。

    我不确定的一件事是反序列化 M2M 字段时的行为应该是什么。通常 django 要求您保存(在您的情况下)文章,然后添加子项。序列化程序实际上并没有进行保存,因此它无法填充孩子。这是另一个问题的主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 2013-02-03
      • 2015-02-25
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多