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 ...
随机推荐
- 【Python】python2 html safe string
import cgi s = '<>&' s += u'哈哈' print type(s) print s r = cgi.escape(s) print type(r) prin ...
- vue-extend 选项
vue-extend 选项 mixins 和extend 很相似,但有区别: var extendNews={ //后来的内容用变量接收 updated:function(){ console.log ...
- docker使用centos7系统构建tomcat镜像
FROM shansongxian/centos-oraclejdk8:latest #此镜像使用centos7系统,精简jdk,只运行java程序,无法编译/构建 MAINTAINER huqian ...
- springMvc-对servletApi的支持以及把后台对象以json方式传到前台
1.对servletApi的支持:request.response以及session.cookie的支持 2.把后台代码以json格式向前台输出: 代码: package com.java.contr ...
- HDU 1305 Immediate Decodability 可直接解码吗?
题意:一个码如果是另一个码的前缀,则 is not immediately decodable,不可直接解码,也就是给一串二进制数字给你,你不能对其解码,因解码出来可能有多种情况. 思路:将每个码按长 ...
- HTML和CSS一般有哪些功能?(聊~平时常出现的那些知识)
简单一点点 HTML行内标签有哪些? 一般行内的标签包含哪些? 如:a - 锚点, span - 常用内联或定义块级容器, i - 斜体, b - 粗体, strong - 粗体强调, var - 定 ...
- C/C++语言补缺 宏- extern "C"-C/C++互调
1. 宏中的# 宏中的#的功能是将其后面的宏参数进行字符串化操作(Stringizing operator),简单说就是在它引用的宏变量的左右各加上一个双引号. 如定义好#define STRING( ...
- 生成.m文件的python代码中出现的错误
错误代码 import tempfile import subprocess import shlex import os import numpy as np import scipy.io scr ...
- yield 生成器的运行机制
yield 生成器的运行机制 当你问生成器要一个数时,生成器会执行,直至出现 yield 语句,生成器把 yield 的参数给你,之后生成器就不会往下继续运行. 当你问他要下一个数时,他会从上次的状态 ...
- WordPress免费清新响应式博客/杂志/图片三合一主题Nana
WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...