Отправлять обратно содержимое файла вместо href с django -rest-framework? - PullRequest
1 голос
/ 14 января 2020

У меня есть модель для статей, которая принимает поле FileField, которое должно быть файлом уценки, чтобы пользователь уже мог загрузить свою статью. Я выставляю API с ModelViewSet.

Это сохраняется в моей папке мультимедиа. Я мог бы получить контент со стороны клиента, ПОЛУЧАЯ его из href, конечно, но это означало бы 2 запроса к моему серверу:

  1. получить информацию о статье (название, контент - это md , дата публикации, описание и др. c ..).
  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()

1 Ответ

3 голосов
/ 19 января 2020

Определение метода serializers.SerializerMethodField - (DRF Do c) .

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>

Update-1

с этот комментарий , Я надеюсь, вам нужен живой редактор уценки в Django Admin , а не FileField .

Итак, используйте любой из этих пакетов уценки , чтобы получить представление в реальном времени в Django Admin. Эти пакеты используют models.TextField для хранения содержимого уценки . Чтобы вы могли читать содержимое из поля в где угодно , как и в других полях модели

...