models管理类抽取基类
Models类 models.py
# coding:utf-8
from django.db import models
from db.Base_model import Base_Model
from db.Base_manager import BaseManager
class UserInfoManager(BaseManager):
def creat(self, username, password, email):
'''添加对象'''
userinfo = self.creat_one_object(username=username, password=password, email=email)
return userinfo
def select(self, username, password=None):
'''查询对象'''
print '%s--zh_cn-' % password
if password is None:
userinfo = self.get_one_object(username=username)
else:
userinfo = self.get_one_object(username=username, password=password)
return userinfo
class AddressManager(BaseManager):
'''地址模型类管理器'''
def get_default_address(self, userinfo_id):
'''获取用户默认收货信息'''
addr = self.get_one_object(userinfo_id=userinfo_id, is_def=True)
return addr
def add_one_address(self, userinfo_id, recipient_name, recipient_addr, recipient_phone, zip_code):
'''添加一个用户收货信息'''
# 查询用户是否有默认地址
def_addr = self.get_one_object(userinfo_id=userinfo_id)
if def_addr is None:
# 如果用户么有默认地址
addr = self.add_one_address(userinfo_id=userinfo_id, recipient_name=recipient_name,
recipient_addr=recipient_addr,
recipient_phone=recipient_phone, zip_code=zip_code, is_def=True)
else:
addr = self.add_one_address(userinfo_id=userinfo_id, recipient_name=recipient_name,
recipient_addr=recipient_addr,
recipient_phone=recipient_phone, zip_code=zip_code)
return addr
class UserInfo(Base_Model):
username = models.CharField(verbose_name='用户名', max_length=20)
password = models.CharField(verbose_name='密码', max_length=40)
email = models.EmailField(verbose_name='邮箱')
objects = UserInfoManager() # 创建管理类对象
class Meta:
db_table = 'userinfos' # 指定表名
class Adderss(Base_Model):
userinfo = models.ForeignKey('UserInfo', verbose_name='所属账户')
recipient_name = models.CharField(max_length=20, verbose_name='收货人')
recipient_phone = models.CharField(max_length=11, verbose_name='收货电话')
recipient_addr = models.CharField(max_length=256, verbose_name='收货地址')
zip_code = models.CharField(max_length=6, verbose_name='邮编')
is_def = models.BooleanField(default=False, verbose_name='默认地址')
objects = AddressManager()
class Meta:
db_table = 's_user_address'
BaseManager.py
# coding=utf-8
from django.db import models
import copy
class BaseManager(models.Manager):
'''定义管理器基类'''
def get_all_valid_fields(self):
'''获取self所在模型类的有效属性字符串列表'''
# 1. 获取self所在的模型类
models_class = self.model
# 2. 获取模型类的属性元组
attr_tuple = models_class._meta.get_fields()
# 3. 定义一个列表用来保存满足的属性名称
str_attr_list = []
for attr in attr_tuple:
# 如果有属性 是外键
if isinstance(attr,models.ForeignKey):
str_attr = '%s_id'%attr.name
else:
str_attr = attr.name
str_attr_list.append(str_attr)
return str_attr_list
# 增
def creat_one_object(self,**kwargs):
'''创建一个self所在模型类的对象'''
# 1.获取self所在模型类的有效属性字符串列表
valid_fields = self.get_all_valid_fields()
# 2.拷贝一份用来处理
kws = copy.copy(**kwargs)
# 3.去除kws 参数中self.model的无效属性
for key in kws:
if key not in valid_fields:
kwargs.pop(key)
# 4.获取self所在模型类
model_class = self.model
# 5.创建一个模型类对象
obj = model_class(**kwargs)
# 6.调用对象的save方法保存进数据库
obj.save()
# 7.返回这个对象
return obj
# 查
def get_one_object(self,**filters):
'''根据filters条件查询self.model模型类的对象'''
try:
obj = self.get(**filters)
except self.model.DoesNotExist:
obj = None
return obj
# 根据条件查询self模型的查询集
def get_object_list(self, filters={}, exclud_filters={}, order_by=('-pk',)):
object_list = self.filter(**filters).exclude(**exclud_filters).order_by(*order_by)
return object_list
# 改
#删
models管理类抽取基类的更多相关文章
- Java如何解决脆弱基类(基类被冻结)问题
概述 大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends.“JAVA设计模式”一书详细阐述了怎样用 ...
- 转 关于C#中派生类调用基类构造函数的理解
关于C#中派生类调用基类构造函数的理解 .c#class 本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1. 当基类中没有自己编写构造函数时,派生类默认的调用 ...
- c++ 派生类向基类转换的可访问性
对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...
- c++中派生类对基类成员的三种访问规则(转)
C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...
- C++ 派生类到基类转换的可访问性
今天看c++ primer关于派生类到基类转换的可访问性,看的很晕,看了下面的文章恍然大悟: http://www.2cto.com/kf/201403/283389.html C++ primer第 ...
- c++ primer 学习杂记2【派生类到基类转换的可访问性】
参考: http://blog.csdn.net/rehongchen/article/details/7930853 http://blog.csdn.net/ming_road/article/d ...
- c++——派生类和基类转换(类型兼容性原则)
基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...
- C++_派生类的构造函数及派生类和基类之间的特殊关系
派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { p ...
随机推荐
- CF1136D Nastya Is Buying Lunch
思路: 1. 最终答案不超过能与Nastya“直接交换”的人数. 2. 对于排在j前面的i,如果i和i-j之间(包括j)的每个人都能“直接交换”,j才能前进一步. 实现: #include <b ...
- vue中background-image图片路径问题
按照以往在css文件中写background:url('图片路径'),完成后加载竟然显示出错,起初以为路径不对,检查了几遍,仍然没有问题.最后百度找答案,发现不少同行都遇到过这种问题,遂记录下自己所采 ...
- CheckPoint_vSEC_Cluster_R77.30
CheckPoint_vSEC_Cluster_R77.30 平台: arm 类型: ARM 模板 软件包: Check Point vSEC Gateway R77.30-041.161 Anti- ...
- node18 服务器上 pytorch cyclegan 测试有问题,numpy 版本不对
提示如下错误: module compiled against API version 0xb but this version of numpy is 0xa 尝试的方法: pip install ...
- webstorm下载激活汉化
下载 官方下载地址:https://www.jetbrains.com/webstorm/ 激活 参考http://blog.csdn.net/it_talk/article/details/5244 ...
- 腾讯云服务器CVM购买详细过程 选择我们需要的腾讯云服务器
腾讯云服务商有云服务器.云数据库.CDN.云存储等产品,其中较多的用户会选择腾讯云服务器,因为用途比较广泛,比如用来软件的运行以及网站建设,如今一般都是用云服务器,而不是用虚拟主机,毕竟虚拟主机的性价 ...
- linux 命令——40 wc (转)
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的字节数. ...
- Redis安装配置及在Python上的应用
最近在使用Kazoo(开源电话系统) API时,一次请求的处理需要调用几次API,只为了得到一个name和id的对应关系,耗时非常大,开始想使用一种简单的实现,直接将对应关系保存到静态类的静态变量中, ...
- Codeforces Round #327 (Div. 2) C Median Smoothing(找规律)
分析: 三个01组合只有八种情况: 000 s001 s010 0011 s100 s101 1110 s111 s 可以看出只有010,101是不稳定的.其他都是稳定的,且连续地出现了1或0,标记为 ...
- 8--oop
oop-Python面向对象 Python的面向对象 面向对象编程 基础 共有私有 继承 组合,Mixin 魔法函数 魔法函数概述 构造类魔法函数 运算类魔法函数 1.面向对象概述(ObjectOri ...