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管理类抽取基类的更多相关文章

  1. Java如何解决脆弱基类(基类被冻结)问题

    概述  大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系).实际上80%的代码应该完全用interfaces写,而不是通过extends.“JAVA设计模式”一书详细阐述了怎样用 ...

  2. 转 关于C#中派生类调用基类构造函数的理解

    关于C#中派生类调用基类构造函数的理解 .c#class       本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1.  当基类中没有自己编写构造函数时,派生类默认的调用 ...

  3. c++ 派生类向基类转换的可访问性

    对于c++面向对象一直很疑惑,这次决定下功夫把它弄明白 一.派生类和基类之间的类型转换 首先理解,派生类含有基类的所有成分,只不过有些就算在派生类的成员函数也不能访问而已. (1)派生类和基类的自动转 ...

  4. c++中派生类对基类成员的三种访问规则(转)

    C++中派生类对基类成员的访问形式主要有以下两种:1.内部访问:由派生类中新增成员对基类继承来的成员的访问.2.对象访问:在派生类外部,通过派生类的对象对从基类继承来的成员的访问.今天给大家介绍在3中 ...

  5. 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

    一.不能自动继承的成员函数 构造函数 析构函数 =运算符 二.继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数. 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类 ...

  6. C++ 派生类到基类转换的可访问性

    今天看c++ primer关于派生类到基类转换的可访问性,看的很晕,看了下面的文章恍然大悟: http://www.2cto.com/kf/201403/283389.html C++ primer第 ...

  7. c++ primer 学习杂记2【派生类到基类转换的可访问性】

    参考: http://blog.csdn.net/rehongchen/article/details/7930853 http://blog.csdn.net/ming_road/article/d ...

  8. c++——派生类和基类转换(类型兼容性原则)

    基类也叫父类,派生类也叫子类. 类之间的继承关系继承关系是类之间的父子关系. 继承关系的特点如下:A. 子类拥有父类的所有属性和行为B. 子类也是一种特殊的父类C. 子类对象可以当父类对象使用D. 子 ...

  9. C++_派生类的构造函数及派生类和基类之间的特殊关系

    派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { p ...

随机推荐

  1. kickstart2019 round_A B. Parcels

    思路: 利用了曼哈顿距离和切比雪夫距离之间的转化. 参考: https://blog.csdn.net/Dylan_Frank/article/details/88985444 https://www ...

  2. 自定义列表dl

    语法格式 <dl> <dt>名词1</dt> <dd>名词1解释1</dd> <dd>名词1解释2</dd> ... ...

  3. javascript动态修改对象的属性名

    在做东钿业务系统的时候,经常碰到写很多重复的ajax对接,于是就想封装一个方法,但是接收data的字段名不一样,所以就需要用到动态对象属性名这个写法了.其实很简单.直接看一下代码吧.

  4. 构建第一个spring boot2.0应用之项目启动运行的几种方式(二)

    方法一. 配置Run/Debug Configuration  选择Main Class为项目 Application启动类(入口main方法) (2).进行项目目录,即包含pom.xml的目录下,启 ...

  5. Centos内核调优参考

    net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_keepalive_time = 600 net.i ...

  6. C语言标准库之setjmp

    协程的介绍 协程(coroutine),意思就是“协作的例程”(co-operative routines),最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程 ...

  7. 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.3 到 12.1.0.2 [发行版 11.2 到 12.1]本文档所含信息适用于所有平台 用 ...

  8. Android(java)学习笔记81:在TextView组件中利用Html插入文字或图片

    1. TextView中利用Html插入文字或者图片: 首先我们看看代码: (1)activity_main.xml: <LinearLayout xmlns:android="htt ...

  9. 动态规划专题(二)——树形DP

    前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...

  10. SpringMVC+Hibernate框架快速搭建

    1.  新建Maven项目springmvc 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...