簡體   English   中英

如何通過郵遞員將發布請求發送到 django-rest-framework 中的嵌套可寫序列化程序?

[英]How to send a post request via postman to nested writable serializer in django-rest-framework?

我真的很難以正確的形式將我的數據與郵遞員發送到我的 Django 后端。 我遵循了 Django 文檔中關於可寫嵌套 Seralizer 的方法,並將其調整為適合我的情況。 如果我通過 shell 將數據傳遞給我的序列化程序,一切正常,我可以創建兩個對象實例StoryFile 但是,如果我嘗試對Got AttributeError when attempting to get a value for field 'file' on serializer 'StoryCreateUpdateSerializer'. The serializer field might be named incorrectly and not match any attribute or key on the 'Story' instance. Original exception text was: 'Story' object has no attribute 'file'.執行相同操作,則它不會成功並收到以下錯誤消息: Got AttributeError when attempting to get a value for field 'file' on serializer 'StoryCreateUpdateSerializer'. The serializer field might be named incorrectly and not match any attribute or key on the 'Story' instance. Original exception text was: 'Story' object has no attribute 'file'.出現了Got AttributeError when attempting to get a value for field 'file' on serializer 'StoryCreateUpdateSerializer'. The serializer field might be named incorrectly and not match any attribute or key on the 'Story' instance. Original exception text was: 'Story' object has no attribute 'file'. Got AttributeError when attempting to get a value for field 'file' on serializer 'StoryCreateUpdateSerializer'. The serializer field might be named incorrectly and not match any attribute or key on the 'Story' instance. Original exception text was: 'Story' object has no attribute 'file'.

通過 Shell 成功請求:

>>> data = {
    'title': 'HALLLO',
    'file': [
        {'content': 'Public Service Announcement'},
        {'content': 'Public Service Announcement'},
        {'content': 'Public Service Announcement'},
    ],
}
>>> serializer = StoryCreateUpdateSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()

通過郵遞員請求不成功。 標題:內容類型:應用程序/json。 身體:未加工

{
    "title": "Test",
    "file": [
        {
            "content": "Hallo"
        }
    ]
}

我的模型和序列化器

#MODELS
class Story (models.Model):
    title = models.CharField(max_length=100,blank=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)

class File(models.Model):
    story = models.ForeignKey(Story,on_delete=models.CASCADE, null=True)
    content = models.TextField(blank=False, null=True)
#SERIALIZER
class TestFileSerializer (serializers.ModelSerializer):

    class Meta:
        model = File
        fields =  ('content',)

class StoryCreateUpdateSerializer (serializers.ModelSerializer):
    file = TestFileSerializer(many=True)

    class Meta:
        model = Story
        fields =  ('title','file')

    def create(self, validated_data):
        current_user = self.context["request"].user
        title = validated_data.pop('title')
        file = validated_data.pop('file')
        story_instance = Story.objects.create(author=current_user, title=title)

        for file_data in file:
            File.objects.create(**file_data, story=story_instance)
        return story_instance
#VIEW
class StoryCreateUpdateViewSet(viewsets.ModelViewSet):
    serializer_class = StoryCreateUpdateSerializer

    queryset = Story.objects.all()

我很高興得到任何澄清。 因為我的想法不多了。

File模型的 ForeignKey 字段中,默認related_namerelated_query_name屬性是'file_set'不是'file'

因此,您應該對代碼進行以下更改之一:


方法一:
File模型中,將related_namerelated_query_name屬性添加到 ForeignKey 字段,其值為'file'

story = models.ForeignKey(
    Story,
    on_delete=models.CASCADE,
    null=True,
    related_name = 'file',
    related_query_name = 'file'
)

方法二:
StoryCreateUpdateSerializer'file'字段更改為'file_set'

class StoryCreateUpdateSerializer (serializers.ModelSerializer):
    file_set = TestFileSerializer(many=True)

    class Meta:
        model = Story
        fields =  ('title','file_set')

    def create(self, validated_data):
        current_user = self.context["request"].user
        title = validated_data.pop('title')
        file = validated_data.pop('file')
        story_instance = Story.objects.create(author=current_user, title=title)

        for file_data in file:
            File.objects.create(**file_data, story=story_instance)
        return story_instance

在此方法中,您還必須更改請求正文屬性並將“file”替換為“file_set”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM