【问题标题】:Django - Saving in multiple models from single APIDjango - 从单个 API 保存多个模型
【发布时间】:2020-08-21 00:06:41
【问题描述】:

我有两个模型,“Blog_model”和“File_model”,其中“Blog_model”的“blog_id”是“File_Model”的外键。这个概念是为一个博客保存多个文件。这是模型结构供参考。

class Blog_model(models.Model):
    type = models.CharField(max_length = 50, default = "FOOD")
    count = models.PositiveIntegerField(default = 0)
    title = models.CharField(max_length = 500, unique = True)
    substance = models.CharField(max_length = 5000, default = "")
    thumbnail = models.ImageField(upload_to = get_media_file_name, default = "")
    text = models.TextField()
    create_time = models.DateTimeField(auto_now_add = True)
    update_time = models.DateTimeField(auto_now = True)


class File_model(models.Model):
    blog_id = models.ForeignKey(Blog_model, on_delete = models.CASCADE)
    file_name = models.FileField(upload_to = get_media_file_name)
    upload_time = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return str(self.file_name)

现在,我想使用一个包含博客详细信息和文件名的 API 创建一个新博客。我正在想象 API 结构类似于 -

{
"type": "FOOD",
"title": "Some Blog",
"Substance": "Some blog about food",
"text": "This is some blog about food",
"thumbnail": <InMemoryUploadedFile: Capture.PNG (image/png)>
"files": [<InMemoryUploadedFile: food1.jpg (image/jpeg)>, <InMemoryUploadedFile: food2.jpg (image/jpeg)>, <InMemoryUploadedFile: food3.jpg (image/jpeg)>]
}

请建议如何实现目标。
如果上面提到的似乎是错误的,您也可以建议正确的 API 结构。
任何建议表示赞赏。
这是我为此目的使用的序列化程序和视图。

-----------------------------------
serializers.py
-----------------------------------

class File_modelCreateSerializer(serializers.ModelSerializer):
    # upload_time = serializers.DateTimeField(format = date_time_format)

    class Meta:
        model = File_model
        fields = ["file_name"]


class Blog_modelCreateSerializer(serializers.ModelSerializer):
    files = File_modelCreateSerializer(many = True, required = False)

    class Meta:
        model = Blog_model
        fields = ["type", "title", "substance", "thumbnail", "text", "files"]

    def create(self, validated_data):
        # files = validated_data.pop("files")       # Getting no key named "files" in validated_data
        new_blog = Blog_model.objects.create(**validated_data)

        # for f in files:
        #     File_model.objects.create(blog_id = new_blog, **f)

        return new_blog


-----------------------------------
views.py
-----------------------------------

# class Blog_modelCreateView(generics.CreateAPIView):   
#     serializer_class = Blog_modelCreateSerializer

class Blog_modelCreateView(APIView):
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, *args, **kwargs):
        blog_serializer = Blog_modelCreateSerializer(data = request.data)
        if blog_serializer.is_valid():
            blog_serializer.save()
            return Response(blog_serializer.data)
        else:
            return Response(blog_serializer.errors)

【问题讨论】:

    标签: django python-3.x rest api django-rest-framework


    【解决方案1】:

    实际上,View 和 Serializer 是链接到一个模型的。 但是,您可以使用 @action 装饰器。

    Django REST Framework: Routing for extra actions

    如果你想将文件序列化程序链接到博客,试试这个。

    class BlogViewSet(ModelViewSet):
        def get_serializer(self):
            if self.action == 'files':
               return FileSerializer
        ...
        @action(url_path='files')
        def file(self):
            qs = File.objects.all()
            ...
    

    【讨论】:

      猜你喜欢
      • 2017-09-08
      • 2015-10-31
      • 1970-01-01
      • 2019-04-15
      • 2016-12-20
      • 2011-06-29
      • 1970-01-01
      • 2020-05-18
      • 2011-06-29
      相关资源
      最近更新 更多