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 ...
随机推荐
- IUserStore------Implements Diagram
- char*、string、CString各种字符串之间转换
参考博客: http://blog.csdn.net/luoweifu/article/details/20242307 http://blog.csdn.net/luoweifu/article/d ...
- C++指针的概念解读
C++指针的概念解读 超详细 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区 ...
- Selenium关闭windows系统弹窗
Selenium关闭windows系统弹窗 背景:在使用某业务时,会弹出windows框 提示要打印某个文本,效果如下,而正常脚本执行完了后,关闭了driver,windows的弹框还是不会消失,这时 ...
- Android(java)学习笔记92:Android线程形态之 AsyncTask (异步任务)
1. AsyncTask和Handler的优缺点比较: 1)AsyncTask实现的原理和适用的优缺点 AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTa ...
- NBU基本常用命令
Veritas常用命令: 1. 查看当有运行的任务 bpdbjobs –report | grep Active 2. 停止任务 bpdbjobs –cancel PID (包括主任务和子任务) 3. ...
- 手机上如何远程控制Linux服务器?
这里介绍3个手机软件,分别是JuiceSSH.Termius和Termux,这3个软件都可以实现远程控制Linux服务器(相当于手机SSH客户端),而且使用起来都非常方便,下面我简单介绍一下这3个软件 ...
- 深入理解计算机系统_3e 第十一章家庭作业 CS:APP3e chapter 11 homework
注:tiny.c csapp.c csapp.h等示例代码均可在Code Examples获取 11.6 A. 书上写的示例代码已经完成了大部分工作:doit函数中的printf("%s&q ...
- python_6_if
_username='qi' _password='abc123' username=input("username:") password=input('password:') ...
- 第三篇、Swift基础学习
1.常量与变量 什么是常量和变量 在Swift中规定:在定义一个标识符时必须明确说明该标识符是一个常量还是变量 使用let来定义常量,定义之后不可以修改 使用var来定义变量,定义之后可以修改 变量的 ...