【问题标题】:remove hostname of image link in django REST API在 django REST API 中删除图像链接的主机名
【发布时间】:2018-05-01 09:43:37
【问题描述】:

我有一个model,如下所示:

# models.py
# ================================================
def get_category_image_name(instance, filename):
    fn = os.path.join('img/thumbnailCategory/ct', str(instance.id) + '.png')
    return fn

def get_food_t_image_name(instance, filename):
    fn = os.path.join('img/imgFood/ft', str(instance.id) + '.png')
    return fn


def get_food_d_image_name(instance, filename):
    fn = os.path.join('img/DDD_Food/fd', str(instance.id) + '.png')
    return fn


def id_generator(size=10, chars='123456789'):
    return ''.join(random.choice(chars) for _ in range(size))


class Category(models.Model):

    id = models.IntegerField(primary_key=True, unique=True, default=id_generator, editable=False)
    title = models.CharField(max_length=50, null=False, blank=False)
    c_thumbnail = models.ImageField(upload_to=get_category_image_name, null=False, blank=False)

    def save(self, *args, **kwargs):
        self.id = id_generator()
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return '%s | %s' % (self.title, self.id)


class Food(models.Model):
    food_id = models.IntegerField(primary_key=True, unique=True, default=id_generator, editable=False)
    name = models.CharField(max_length=30, null=False, blank=False)
    desc = models.TextField(max_length=200)
    category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
    price = models.IntegerField(null=False, blank=False)
    f_thumbnail = models.ImageField(upload_to=get_food_t_image_name)
    DDD_data = models.ImageField(upload_to=get_food_d_image_name)
    availability = models.BooleanField(default=True)
    discount = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        self.id = id_generator()
        super(Food, self).save(*args, **kwargs)

    def __str__(self):
        return '%s %s %s' % (self.name, self.category_id, self.price)

我为按类别过滤食物的食物编写了一个过滤器。

我的views.py 是这样的:

class GetListOfFoodsByCategory(viewsets.ModelViewSet):
    queryset = Food.objects.all()
    serializer_class = FoodSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_fields = ('category_id',)

我的urls.py 有:

router = routers.SimpleRouter()
router.register(r'food', views.GetListOfFoodsByCategory)
urlpatterns += router.urls

而我的序列化器就是这样的:

class FoodSerializer(serializers.ModelSerializer):

    class Meta:
        model = Food
        fields = '__all__'

我的问题是:

当我运行项目并查看食物图像的链接时,它会显示图像的主机名/目录。我想从中删除主机名。如下所示:

我怎样才能删除它?

感谢您的帮助。

【问题讨论】:

    标签: django django-models django-serializer


    【解决方案1】:

    您可以使用SerializerMethodField 覆盖图像字段:

    class FoodSerializer(serializers.ModelSerializer):
        f_thumbnail = serializers.SerializerMethodField()
        DDD_data = serializers.SerializerMethodField()
    
        class Meta:
            model = Food
            fields = '__all__'
    
        def get_f_thumbnail(self, obj):
            if obj.f_thumbnail:
                return obj.f_thumbnail.url
    
        def get_DDD_data(self, obj):
            if obj.DDD_data:
                return obj.DDD_data.url
    

    【讨论】:

    • @shahab 我忘了验证。检查更新的答案,我添加了if obj.DDD_data 验证。没有它,如果图像为空,Django 将引发错误。
    • 谢谢,这解决了我的问题。但是这样一来,该 ImageField 的上传字段按钮在 DRF 的 API 查看器中消失了。解决办法是什么?
    • @swdev 尝试 pverride 序列化程序的 to_representation 方法而不是 SerializerMethodField
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2016-11-08
    • 2018-02-01
    相关资源
    最近更新 更多