gpt4 book ai didi

python - 使用 django-rest-framework 发回文件内容而不是 href?

转载 作者:行者123 更新时间:2023-11-30 21:53:13 24 4
gpt4 key购买 nike

我有一个文章模型,它采用一个字段 FileField ,该字段应该是一个 markdown 文件,供用户加载其文章。我使用 ModelViewSet 公开 api。

这已保存到我的媒体文件夹中。当然,我可以通过从 href 获取内容来从客户端获取内容,但这意味着对我的服务器有 2 个请求:

  1. 获取文章信息(标题、内容 - 这是 MD、发布日期、描述等。)。
  2. 从链接获取内容。

但我想知道是否有一种方法可以告诉 django 在响应文章项的请求时只发送文件内容而不是 href

这是我的模型和 API:

# ---------------------- #
# src/articles/models.py #
# ---------------------- #

from os.path import splitext
from uuid import uuid4
from django.db import models

# Create your models here.


def hashFilename(instance, name):
ext = splitext(name)[1]
return "articles/{}{}".format(uuid4(), ext)


def hashImageFilename(instance, name):
ext = splitext(name)[1]
return "images/{}{}".format(uuid4(), ext)


class Article(models.Model):
title = models.CharField(("title"), max_length=100)
content = models.FileField("content", upload_to=hashFilename)
description = models.TextField(("description"), default='')
uploadDate = models.DateTimeField(("uploadDate"), auto_now=True)
lastModified = models.DateTimeField(("uploadDate"), auto_now=True)
publicationDate = models.DateField("publicationDate")
image = models.ImageField("image", upload_to=hashImageFilename)

def __str__(self):
return self.title

# ------------------------- #
# src/articles/api/views.py #
# ------------------------- #

from rest_framework.viewsets import ModelViewSet

from ..models import Article
from .serializers import ArticleSerializerFull, ArticleSerializerShort


class ArticlesViewSet(ModelViewSet):
queryset = Article.objects.all()

def get_serializer_class(self):
if self.action == 'list':
serializer = ArticleSerializerShort
else:
serializer = ArticleSerializerFull
return serializer

queryset = Article.objects.all()

最佳答案

定义 serializers.SerializerMethodField--(DRF Doc)方法将完成这项工作。

class ArticleSerializer(serializers.ModelSerializer):
<b>content = serializers.SerializerMethodField()

def get_content(self, article):
return article.content.file.read()</b>

class Meta:
fields = '__all__'
model = Article
<小时/>

或者,您可以通过重写序列化器的 to_representation 方法来实现相同的目的。

class ArticleSerializer(serializers.ModelSerializer):
class Meta:
fields = '__all__'
model = Article

<b>def to_representation(self, instance):
rep = super().to_representation(instance)
rep['content'] = instance.content.file.read()
return rep</b>
<小时/>

更新1

来自this comment ,我希望您需要 Django Admin 中的实时 Markdown 编辑器,而不是 FileField
< br/>所以,使用 any of these markdown packages在 Django Admin 中获取实时 View 。这些包正在使用 models.TextField存储 Markdown 内容。这样您就可以像任何其他模型字段一样从任何地方读取字段内容

关于python - 使用 django-rest-framework 发回文件内容而不是 href?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59737609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com