django - 序列化程序 ForeignKey 结果为 "Expected a dictionary ..."

标签 django django-rest-framework

我的模型:

class Font(ValidateVersionOnSaveMixin, models.Model):
    id = models.UUIDField(primary_key=True, editable=True)  
    name = models.CharField(max_length=100, blank=False, null=False)


class Glyph(ValidateVersionOnSaveMixin, models.Model):
    id = models.UUIDField(primary_key=True, editable=True)  
    unit = models.CharField(max_length=100, blank=False, null=False, unique=True)
    font = models.ForeignKey(Font, on_delete=models.CASCADE)

我想发布以下 JSON 以将字形添加到现有的字体(具有 fontId 作为 ID)对象。

{
  fontId: "4a14a055-3c8a-43ba-aab3-221b4244ac73"
  id: "40da7a83-a204-4319-9a04-b0a544bf4440"
  unit: "aaa"
}

由于 ForeignKey 字段 font 和 JSON 属性 fontId 不匹配,我在我的 Serializer 中添加了 source='font' :

class FontSerializer(serializers.ModelSerializer):
    class Meta:
        model = Font
        fields = ('id', 'name')


class GlyphSerializer(serializers.ModelSerializer):
    fontId = FontSerializer(source='font')
    class Meta:
        model = Glyph
        fields = ('id', 'unit', 'fontId' )

但结果是 BAD REQUEST 错误:

{"fontId":{"non_field_errors":["Invalid data. Expected a dictionary, but got str."]}}

更新

下面的 Serializer 给了我想要的结果。

class GlyphSerializer(serializers.ModelSerializer):
    fontId = serializers.PrimaryKeyRelatedField(
        queryset=Font.objects.all(),
        required=True,
        source='font',
        write_only=False
    )
    class Meta:
        model = Glyph
        fields = ('id', 'unit', 'version', 'fontId')

最佳答案

您可以使用 model_to_dict 方法如下:

from django.forms.models import model_to_dict
model_to_dict(obj)

关于django - 序列化程序 ForeignKey 结果为 "Expected a dictionary ...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40475309/

相关文章:

django - 如何使用 Django annotate 在 QuerySet 上添加注释?

python - Django - 仅当两个对象的外键不同时,它们的字段才能具有相同的值

Django ModelForm 验证

Django 从 [ErrorDetail(string ='Test Message' , code ='invalid' )] 中提取字符串

django - 在 ModelViewSet 中返回 422 状态码

django - 如何检索 Django 中所有对象的字段列表?

URLS 问题中的 Django 双斜杠(多个 Web 服务器、Apache 和 Nginx)

django - 从 Angular 前端在 Django Rest Framework 3.0 中保存上传的文件时出现问题

Django Rest Framework - 如何在序列化器中嵌套多个字段?

django - 为 DRF、Django 和 React 前端配置 Nginx 和 Gunicorn