如何在Django REST中将字符串添加到ModelSerializer

时间:2018-09-01 07:12:28

标签: python django django-rest-framework

在我的数据库中,我存储了一个特定图像的文件名。假设这是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 :(得分:3)

首先,您可以使用模型的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__'

答案 1 :(得分:0)

尝试在您的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

祝你好运!