Django rest framework 无法在django rest框架中反序列化对象

Django rest framework 无法在django rest框架中反序列化对象,django-rest-framework,Django Rest Framework,我正在仔细阅读并尝试实现一个基本的反序列化程序。我有点困惑,因为我的实验代码会产生毫无意义的随机结果 我有一个简单的django模型: class ArticleType(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=15) class Article(models.Model): id = models.AutoField(primar

我正在仔细阅读并尝试实现一个基本的反序列化程序。我有点困惑,因为我的实验代码会产生毫无意义的随机结果

我有一个简单的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''}
从这里我有几个问题

  • 为什么数据发生了变化

  • 如果数据无效,为什么
    .is\u valid()
    方法返回true

  • 文档中关于我将在何处实现从长度为15的CharField到在我的article_type字段中实际返回ArticleType实例的转换的描述很模糊


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

    数据未更改。这些是模型中指定的默认值。是您的序列化程序定义导致
    .is\u 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要求您保存(在您的情况下)文章,然后添加子项。序列化程序实际上不进行保存,因此无法填充子项。然而,这是另一个问题的主题