Как добавить строку в ModelSerializer в Django REST - PullRequest
0 голосов
/ 01 сентября 2018

В моей базе данных я храню имя файла определенного изображения для элемента. Допустим, это модель в models.py

from django.db import models

class Product(models.Model):
    sku = models.CharField(validators=[isalphanumeric], max_length=20, null=False, blank=False)
    image = models.CharField(max_length=20, blank=False, null=False)

и затем у меня есть сериализатор, определенный так в serializers.py

from rest_framework import serializers
from app.models import Product

class ProductSerializer(serializer.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

я хочу добавить строку к изображению Product, которая превращает его в строку, представляющую относительную ссылку, что-то вроде:

storage_location = '/assets/img'
img_url = f'{storage_location}/{image}'

Причина, по которой я хочу это сделать, заключается в том, что я хочу проявлять гибкость в отношении URL-адресов, а не в том, чтобы имя файла являлось «местоположением файла», а затем мне приходилось обновлять базу данных каждый раз, когда я меняю порядок расположения своих изображений ( Я до сих пор не знаю, как их хранить).

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Попробуйте в вашем serialiser.py

class ProductSerializer(serializer.ModelSerializer):
     img_url = serializers.SerializerMethodField()
     class Meta:
          model = Product
          fields = '__all__' 
          #fields = ('sku', 'img_url') # This is what i will prefer
     def get_img_url(self, obj):
         storage_location = '/assets/img'
         img_url = f'{storage_location}/{obj.image}'
         return img_url

Удачи!

0 голосов
/ 01 сентября 2018

Прежде всего, вы можете использовать модель ImageField для этого:

class Product(models.Model):
    sku = models.CharField(validators=[isalphanumeric], max_length=20, null=False, blank=False)
    image = models.ImageField(max_length=20, blank=False)

Это автоматически добавит значение MEDIA_URL к значению при получении значения.

Если вы хотите использовать CharField, вы можете делать то, что вам нужно на уровне сериализатора, используя SerializerMethodField:

class ProductSerializer(serializer.ModelSerializer):
    image = serializers.SerializerMethodField()

    def get_image(self, obj):
        storage_location = '/assets/img'
        img_url = f'{storage_location}/{obj.image}'
        return img_url

    class Meta:
        model = Product
        fields = '__all__'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...