Django数据库分表代码实例

app名称为‘core’,基本的models.py文件内容如下:

class Province(models.Model):
    name = models.CharField(u'省份名称',max_length=32)
    code = models.IntegerField(verbose_name=u'区号', unique=True)
    
    def __unicode__(self):
        return self.name
    
    class Meta:
        verbose_name = u'省份列表'
        verbose_name_plural = u'省份列表'

法I:

重构 manager 中的 get_query_set() 方法。

需要说明的是: 默认情况下,会为每一个models 类添加一个名为 objects 的 Manager,这个就是 Province.objects.all() 中 objects 的由来。

修改后的 models.py 代码如下,表结构必须一致:

# coding:utf-8
from django.db import models

# Create your models here.
class ProvinceManager(models.Manager):
    def get_queryset(self):
#         return super(ProvinceManager, self).get_queryset().filter(id=1)
        self.model._meta.db_table = 'core_province_1' # 我的app名为core
        return super(ProvinceManager, self).get_queryset()10         11     
class Province(models.Model):
    name = models.CharField(u'省份名称',max_length=32)
    code = models.IntegerField(verbose_name=u'区号', unique=True)
    
    objects = ProvinceManager()
    
    def __unicode__(self):
        return self.name
    
    class Meta:
        verbose_name = u'省份列表'
        verbose_name_plural = u'省份列表'

可以多写几个 Manager 来对应不同的表,同时对应多写几个不同的 objects(可以随意起名),在调用时调用相应的 Manager。

法II:

在哪里调用就在哪里更改。更改处添加代码如下:

from core.models import Province

Province._meta.db_table = 'core_prvoince_2'
rows = Province.objects.all() 

总结:

不论哪种方法,其主要还是要更改 models 的 _meta.db_table 的值

腾讯云云产品双12限时秒杀【点击购买】

搬瓦工,CN2高速线路,1GB带宽,电信联通优化KVM,延迟低,速度快,建站稳定,搬瓦工BandwagonHost VPS优惠码BWH26FXH3HIQ,支持<支付宝> 【点击购买】!

Vultr$3.5日本节点,512M内存/500G流量/1G带宽,电信联通优化,延迟低,速度快【点击购买】!

阿里云香港、新加坡VPS/1核/1G/25G SSD/1T流量/30M带宽/年付¥288【点击购买】

百度云不止一折优惠【点击购买】

发表评论

电子邮件地址不会被公开。 必填项已用*标注