2016-11-07 27 views
0

我的模型:串行ForeignKey的結果「預期字典......」

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我加入我的串行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') 

但結果卻是一個錯誤請求錯誤:

{"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') 
+0

相關 - https://stackoverflow.com/questions/28010663/serializerclass-field-on-serializer-save-from-primary-key –

+0

[SerializerClass字段串行器保存從主鍵]可能的副本(http:///stackoverflow.com/questions/28010663/serializerclass-field-on-serializer-save-from-primary-key) –

回答

1

您已定義fontId爲序列化對象(FontSerializer)。但是,該序列化器又被定義爲同時擁有一個id和一個名稱。你的json字典只發佈一個id。你將不得不改變,要同時包含一個ID和一個名字的字典

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

字體已存在。我想用我的JSON爲這個字體添加一個字形。有沒有辦法做到這一點,而不改變JSON? – tobltobs

+0

抱歉延誤。錯過了通知。你有沒有設法解決這個問題,或者你還需要這種輸入嗎? – e4c5

+0

謝謝你回覆。我把它整理出來,看看我的問題更新。 – tobltobs

0

您收到此錯誤的原因是,在反序列化過程中,DRF調用.is_valid(raise_exception=True)你可以打電話serializer.save(validated_data)之前。 non_field_errors列出了此過程中的任何常規驗證錯誤。在您的GlyphSerializer中,您的FontSerializer是嵌套的序列化程序,它與Python字典相關。所以它會引發你遇到的任何非字典數據類型的錯誤。

您可以創建的GlyphSerializer一個子類,稱爲GlyphCreateSerializer

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') 

class GlyphCreateSerializer(GlyphSerializer): 
    fontId = serializers.CharField() 

你也可以使用GlyphCreateSerializer在您的視圖集POST請求。