Django Rest Framework 针对不同帐户级别(基本、高级)的不同图像大小

问题描述 投票:0回答:1

Bultin 帐户分为三个级别:基本、高级和企业: 上传图片后拥有“基本”计划的用户可获得:

  • 链接到高度为 200 像素的缩略图 拥有“高级”计划的用户可获得:
  • 高度为 200 像素的缩略图链接
  • 指向高度为 400 像素的缩略图的链接
  • 原始上传图片的链接

我不知道如何结合保存用户根据其会员资格添加的不同分辨率的照片的能力。 我的解决方案为所有用户保存一个分辨率。

模型.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from PIL import Image


def user_directory_path(instance, filename):
    return 'images/{0}'.format(filename)


class Images(models.Model):

    title = models.CharField(max_length=250)
    image = models.ImageField(upload_to=user_directory_path)
    created = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.PROTECT, related_name='author')

    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        img = Image.open(self.image.path)

        if img.height > 200:
            output_size = (200, 200)
            img.thumbnail(output_size)
            img.save(self.image.path)


class Profile(models.Model):

    MEMBERSHIP = (
        ('BASIC', 'Basic'),
        ('PREMIUM', 'Premium'),
        ('ENTERPRISE', 'Enterprise')
    )

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    membership = models.CharField(max_length=10, choices=MEMBERSHIP, default='BASIC')

    def __str__(self):
        return f'{self.user.username} {self.membership} Profile'

序列化程序.py

from rest_framework import serializers
from blog.models import Images, Profile



class ImagesSerializer(serializers.ModelSerializer):

    class Meta:
        model = Images
        fields = ('author', 'title', 'image')


views.py

class ImagesViewSet(viewsets.ModelViewSet):

    queryset = Images.objects.all()
    serializer_class = ImagesSerializer

    def get_queryset(self):

        user = self.request.user
        return Images.objects.filter(author=user)

python django django-models django-rest-framework membership
1个回答
0
投票

我认为您需要扩展模型并将所有分辨率的图像保存在数据库中:

# models.py
class Images(models.Model):

    title = models.CharField(max_length=250)
    image = models.ImageField(upload_to=user_directory_path)
    image_200 = models.ImageField(upload_to=user_directory_path_200)
    image_400 = models.ImageField(upload_to=user_directory_path_200)
    
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)

        img_200 = Image.open(self.image.path)
        img_400 = Image.open(self.image.path)

        output_size_200 = (200, 200)
        output_size_400 = (400, 400)
        img_200.thumbnail(output_size_200)
        img_400.thumbnail(output_size_400)
        img_200.save(self.image_200.path)
        img_400.save(self.image_400.path)

然后你需要根据用户权限添加序列化,像这样:

# serializers.py
class ImagesBasicUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = Images
        fields = ('author', 'title', 'image_200')


class ImagesPremiumUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = Images
        fields = ('author', 'title', 'image_200', 'image_400', 'image')

然后通过覆盖 get_serializer_class 方法,根据用户的权限序列化数据,如下所示:

# views.py
class ImagesViewSet(viewsets.ModelViewSet):

    queryset = Images.objects.none()
    serializer_class = ImagesBasicUserSerializer
    
    def get_user(self):
        
        user = self.request.user
        return user

    def get_serializer_class(self):
        
        user = self.get_user()
        if user.membership == 'Basic':
            return ImagesBasicUserSerializer
        if user.membership == 'Premium':
            return ImagesPremiumUserSerializer
    
    def get_queryset(self):

        user = self.get_user()
        return Images.objects.filter(author=user)
© www.soinside.com 2019 - 2024. All rights reserved.