Django Rest Framework如何实现内置+可扩展的账户图片尺寸层级?
实现可后台管理的会员层级与图片权限控制
1. 创建可后台编辑的会员层级模型
把原来硬编码的会员选项改成独立模型,这样就能在管理面板自由添加/修改层级,同时为每个层级配置对应的图片访问权限:
from django.db import models from django.contrib.auth.models import User class MembershipTier(models.Model): name = models.CharField(max_length=50, unique=True, verbose_name="会员层级名称") code = models.CharField(max_length=20, unique=True, verbose_name="层级标识(如BASIC)") # 用JSON字段存储允许的图片尺寸,格式示例:['200px', '400px', 'original'] allowed_image_sizes = models.JSONField(verbose_name="允许访问的图片尺寸") is_default = models.BooleanField(default=False, verbose_name="是否为新用户默认层级") def __str__(self): return self.name class Meta: verbose_name_plural = "会员层级"
2. 修改Profile模型关联会员层级
将原来的固定选项字段改为外键,关联到上面的MembershipTier模型:
class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) # 新用户默认使用标记为is_default的层级 membership = models.ForeignKey(MembershipTier, on_delete=models.SET_DEFAULT, default=lambda: MembershipTier.objects.get(is_default=True)) def __str__(self): return f'{self.user.username} {self.membership.name} Profile'
3. 配置后台管理
在admin.py中注册两个模型,就能在管理面板操作会员层级和用户档案:
from django.contrib import admin from .models import MembershipTier, Profile admin.site.register(MembershipTier) admin.site.register(Profile)
4. 图片权限判断逻辑
假设你有存储用户图片的模型,可以添加方法根据会员层级返回允许访问的图片链接:
class UserImage(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) original_image = models.ImageField(upload_to='user_images/') thumbnail_200 = models.ImageField(upload_to='user_images/thumbnails/200/', blank=True) thumbnail_400 = models.ImageField(upload_to='user_images/thumbnails/400/', blank=True) def get_allowed_image_links(self): allowed_sizes = self.user.profile.membership.allowed_image_sizes links = {} if '200px' in allowed_sizes: links['200px'] = self.thumbnail_200.url if self.thumbnail_200 else None if '400px' in allowed_sizes: links['400px'] = self.thumbnail_400.url if self.thumbnail_400 else None if 'original' in allowed_sizes: links['original'] = self.original_image.url return links
额外提示
- 首次迁移前,需要先在数据库中创建默认会员层级(比如Basic)并勾选
is_default,也可以通过数据迁移脚本自动初始化初始层级。 - 如果使用低于Django 3.1的版本,JSON字段可以替换为
TextField,存储字符串格式的列表后在代码中解析。 - 图片缩略图可以用
django-imagekit等库自动生成,无需手动上传。
内容的提问来源于stack exchange,提问作者Gio
相关产品推荐
相关产品推荐

