Django分表实现方法

需求描述:对一特定内容(例:新闻)进行分权限管理,实现方式,不同类别的新闻创建不同的数据表,存在问题,查看新闻详情时需先找到对应的数据表;

解决方案:将所有新闻存入一张新闻表,创建多个管理端,不同管理端按条件加载新闻列表,即进行数据表分表管理。

一、父类为抽象类(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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值