【问题标题】:How to create two object instances from two different models with a single POST request?如何使用单个 POST 请求从两个不同的模型创建两个对象实例?
【发布时间】:2020-11-16 15:40:59
【问题描述】:

我正在学习 Django-Rest 框架。我想通过一个发布请求为我的Story 模型和File 模型创建一个对象实例。所以传入的数据包含一个标题和一个文件。然后我想创建一个带有标题的故事对象,并且图像字段包含对文件实例 id 的引用(fk)。在 File 模型中,使用传入的文件数据创建自己的 File 实例。

# File Model
class File(models.Model):
    file = models.FileField(upload_to='audio_stories/', null=True, default='some_value')

# Story Model
class Story (models.Model):
    title = models.CharField(max_length=100,blank=True)
    image = models.ForeignKey(File,on_delete=models.CASCADE, blank=True, default=None)

# Story  Serializer
class StoryCreateUpdateSerializer (serializers.ModelSerializer):
    image = TestFileSerializer()

    class Meta:
        model = Story
        fields =  ('title','image')
        
        def create(self, validated_data):
            image = validated_data.pop('image')
            title = validated_data.pop('title')
            image_instance = File.objects.create(file=image)
            story_instance = Story.objects.create(title=title, image=image_instance)
            return story_instance

# File Serializer
class TestFileSerializer (serializers.ModelSerializer):

    class Meta:
        model = File
        fields =  ('__all__')

如果我通过 Postman 将表单数据发送到我的服务器,它会回复 "image": ["This field is required."]。如果这是一个明显的错误,我提前道歉。

感谢您的澄清。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我怀疑您的 StoryCreateUpdateSerializer 中有缩进错误 def create() 应与 class Meta: 处于同一缩进级别

    除此之外,我将您的代码与我最近处理的类似代码进行了比较,在一个序列化程序类中,您从请求中弹出数据,然后调用另一个序列化程序。除非我们都遗漏了什么,否则您似乎做得正确。

    一个例子:

    class BookSerializer(serializers.ModelSerializer):
        pages = PageSerializer(many=True)
        class Meta:
            model = Book
            fields = ['id', 'title', 'pages']
        
        def create(self, validated_data):
            pages_data = validated_data.pop('pages')
            book = book.objects.create(**validated_data)
            for page_data in pages_data:
                # Page has foreign key to book
                Page.objects.create(book=book, **page_data)
            return book
    

    【讨论】:

    • 非常感谢您指出缩进错误。我修好了它。但是错误消息仍然存在。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多