需求描述:对一特定内容(例:新闻)进行分权限管理,实现方式,不同类别的新闻创建不同的数据表,存在问题,查看新闻详情时需先找到对应的数据表;
解决方案:将所有新闻存入一张新闻表,创建多个管理端,不同管理端按条件加载新闻列表,即进行数据表分表管理。
一、父类为抽象类(abstract = True)
定义父类:
class BaseModel(models.Model): #定义公共属性 pass class Meta: # 说明是一个抽象模型类,此句必须有,否 则迁移会失败 abstract = True
子类继承父类:
class SonModel(BaseModel): #自有属性 pass class Meta: db_table = 'SonDB' verbose_name = '子类' verbose_name_plural = '子类' class ChildModel(BaseModel): #自有属性 pass class Meta: db_table = 'ChildDB' verbose_name = '孩子类' verbose_name_plural = '孩子类'
执行数据库迁移命令:python manage.py makemigrations
python manage.py migrate
数据库中创建SonDB和ChildDB,两数表独立管理,公用公共字段
二、代理模式(proxy = True)
定义父类:
class BaseModel(models.Model):
#定义公共属性
pass
class Meta:
db_table = 'MDB'
子类基础:
class SonModel(BaseModel):
class Meta:
verbose_name = '子类'
verbose_name_plural = '子类'
proxy = True # 不设置这个就会再生成一张表
class ChildModel(BaseModel):
class Meta:
verbose_name = '孩子类'
verbose_name_plural = '孩子类'
proxy = True # 不设置这个就会再生成一张表
执行数据库迁移命令,数据库中只生成MDB表,但admin可注册“子类”和“孩子类”两个管理点
分表管理:
# 子类管理
class SonModeladmin(admin.ModelAdmin):
# 重写管理列表
def get_queryset(self, request):
# 加载原始列表
qs = super(SonModeladmin, self).get_queryset(request)
#数据处理(权限判断等)
# 过滤列表
qs = qs.filter(过滤条件)
return qs
# 对外键进行处理
def formfield_for_foreignkey(self, db_field, request, **kwargs):
# 过滤栏目下拉框,仅展示高考栏目
if db_field.name == "外键名":
# 根据条件进行过滤
kwargs["queryset"] = get_column('gk')
return super(SonModeladmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
#孩子类
class ChildModeladmin(admin.ModelAdmin):
#过滤条件变化
pass