You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:02:30