Model

解析

Django的数据库,涉及相关操作时就是以下流程:

  1、创建数据库,设计表结构和字段

  2、使用Mysqldb来连接数据库,并编写数据访问层

  3、业务逻辑层去调用数据访问层执行数据库操作

import MySQLdb

def GetList(sql):
db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchall()
db.close()
return data def GetSingle(sql):
db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')
cursor = db.cursor()
cursor.execute(sql)
data = cursor.fetchone()
db.close()
return data

Django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)。

生成表结构的命令 

python manage.py makemigrations

python manage.py migrate

注册后台Admin账户命令

python manage.py createsuperuser

  

一、创建表

1、基础结构

class UserInfo(models.Model):
user = models.CharField(max_length=32) # 字符串(必须带字节长度参数)
email = models.EmailField(max_length=32)
pwd = models.CharField(max_length=64)
user_type = models.ForeignKey("UserType") # (一对多)models.ForeignKey 连表关系 class UserType(models.Model):
nid = models.AutoField(primary_key=True) # 自增列(主键)
caption = models.CharField(max_length=16, unique=True) # unique=True 不允许重复
、models.AutoField  自增列 = int()
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
、models.CharField  字符串字段 ;必须 max_length 参数
、models.BooleanField  布尔类型=tinyint()不能为空,’Blank=True
、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
、models.DateTimeField  日期类型 datetime
  同DateField的参数
、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
、models.FloatField  浮点类型 = double
、models.IntegerField  整形
、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-, ),
    'IntegerField': (-, ),
    'BigIntegerField': (-, ),
    'PositiveSmallIntegerField': (, ),
    'PositiveIntegerField': (, ),
  }
、models.IPAddressField  字符串类型(ip4正则表达式)
、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
、models.NullBooleanField  允许为空的布尔类型
、models.PositiveIntegerFiel  正Integer
、models.PositiveSmallIntegerField  正smallInteger
、models.SlugField  减号、下划线、字母、数字
、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
、models.TextField  字符串=longtext
、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
、models.URLField  字符串,地址正则表达式
、models.BinaryField  二进制
、models.ImageField 图片
、models.FilePathField 文件

更多字段

、null=True
  数据库中字段是否可以为空
、blank=True
  django的 Admin 中添加数据时是否可允许空值
、primary_key = False
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
、auto_now 和 auto_now_add
  auto_now 自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add 自动创建---永远是创建时的时间
、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=,choices = GENDER_CHOICE)
、max_length
、default  默认值
、verbose_name  Admin中字段的显示名称
、name|db_column  数据库中的字段名称
、unique=True  不允许重复
、db_index = True  数据库索引
、editable=True  在Admin里是否可编辑
、error_messages=None  错误提示
、auto_created=False  自动创建
、help_text  在Admin中提示帮助信息
、validators=[]
、upload-to video = models.FileField(upload_to = 'myvideo')上传文件的路径

更多参数

2、连表结构

一对一:models.OneToOneField(其他表)

一对多:models.ForeignKey(其他表)

多对多:models.ManyToManyField(其他表)

应用场景

一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型(普通用户、超级用户等)。 多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个用户组。 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
例如:创建用户详细信息时,需要为用户指定一个test登陆账号,创建其它用户详细信息时,无法指定test账号。
class UserInfo(models.Model):
user = models.CharField(max_length=) # 字符串(必须带字节长度参数)
email = models.EmailField(max_length=)
pwd = models.CharField(max_length=)
user_type = models.ForeignKey("UserType") # (一对多)models.ForeignKey 连表关系 class UserType(models.Model):
nid = models.AutoField(primary_key=True) # 自增列(主键)
caption = models.CharField(max_length=, unique=True) # unique=True 不允许重复

一对多

class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=)
ip = models.CharField(max_length=)
# h2g = models.ManyToManyField('Group') # 与下面建立多对多关系是一样的,差别就是放在下面关联表是上面这个Host表 class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=) h2g = models.ManyToManyField('Host') # 建立多对多关系

多对多

二、操作表

1、单表操作

    # 增
# models.Tb1.objects.create(c1='xx', c2='oo') 增加一条数据,可以接受字典类型数据 **kwargs # obj = models.Tb1(c1='xx', c2='oo')
# obj.save() # 查
# models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
# models.Tb1.objects.all() # 获取全部
# models.Tb1.objects.filter(name='seven') # 获取指定条件的数据 # 删
# models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据 # 改
# models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均支持 **kwargs
# obj = models.Tb1.objects.get(id=1)
# obj.c1 = '111'
# obj.save() # 修改单条数据

  1.1、增加数据

可以接受字典类型数据 **kwargs

obj = models.UserType(caption='管理员')  # 在表中插入数据  UserType为表名
obj.save() # 提交进去 models.UserType.objects.create(caption='普通用户') # 在表里插入数据(两种都是在表里插入数据) user_dict = {'caption': '超级管理员'}
models.UserType.objects.create(**user_dict)
 # 在UserInfo中插入数据

    user_info_dict = {'user': 'alex',
'email': 'alex3712@qq.com',
'pwd': '123',
'user_type': models.UserType.objects.get(nid=1) # (获取的是一个对象)获取表UserType的nid=1的数据
}
user_info_dict = {'user': 'even',
'email': 'even3712@qq.com',
'pwd': '123',
'user_type': models.UserType.objects.get(nid=1) # (获取的是一个对象)获取表UserType的nid=1的数据
} models.UserInfo.objects.create(**user_info_dict) # **表示插入所有

  1.2、查找数据

models.Tb1.objects.get(id=123)         # 获取单条数据,不存在则报错
models.Tb1.objects.all() # 获取全部
models.Tb1.objects.filter(name='test') # 获取指定条件的数据
# 单表查询,结果为queryset类型

    ret = models.UserType.objects.all()
print(type(ret), ret, ret.query) # 输出是<class 'django.db.models.query.QuerySet'>,
# <QuerySet [<UserType: UserType object>等,为queryset类型
for item in ret:
print(item, item.nid, item.caption) # 输出UserType object 2 普通用户这类数据
"""
"""
ret1 = models.UserType.objects.all().values('nid')
print(type(ret1), ret1, ret1.query) # 输出<QuerySet [{'nid': 2}, {'nid': 1}, {'nid': 3}]>
for item in ret1:
print(item, type(item)) # 输出的是{'nid': 2} <class 'dict'>这类字典类型 ret = models.UserType.objects.all().values_list('nid')
print(type(ret), ret) # 输出结果<class 'django.db.models.query.QuerySet'> <QuerySet [(2,), (1,), (3,)]>

  1.3修改数据

models.Tb1.objects.filter(name='test').update(age='30')  # 将指定条件的数据更新,均支持 **kwargs

obj = models.Tb1.objects.get(id=1)
obj.c1 = '111'
obj.save() # 修改单条数据

  1.4删除数据

models.user.objects.filter(name='seven').delete() # 删除指定条件的数据

  1.5、获取个数

models.author.objects.filter(age='30').count()  # author是作者表

  1.6、排列

models.author.objects.filter(age='30').order_by('id')    # asc
models.author.objects.filter(age='30').order_by('-id') # desc

  1.7、大于、小于

models.Tb1.objects.filter(id__gt=1)              # 获取id大于1的值
models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值
models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值

  1.8、存在

models.Tb1.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in

  1.9、contains

models.Tb1.objects.filter(name__contains="ven")
models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
models.Tb1.objects.exclude(name__icontains="ven")

  1.10、其他

# range  随机的
#
# models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # 其他类似
#
# startswith,istartswith, endswith, iendswith, # order by 排序
#
# models.Tb1.objects.filter(name='seven').order_by('id') # asc
# models.Tb1.objects.filter(name='seven').order_by('-id') # desc # limit 、offset 分页
#
# models.Tb1.objects.all()[10:20] # group by 分组
from django.db.models import Count, Min, Max, Sum
# models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) #values这个映射后,就是根据id来分组
# SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

  

2、连表操作

  2.1、一对多

(已创建表UserType和UserInfo)

class UserInfo(models.Model):
user = models.CharField(max_length=) # 字符串(必须带字节长度参数)
email = models.EmailField(max_length=)
pwd = models.CharField(max_length=)
user_type = models.ForeignKey("UserType") # (一对多)models.ForeignKey 连表关系 class UserType(models.Model):
nid = models.AutoField(primary_key=True) # 自增列(主键)
caption = models.CharField(max_length=, unique=True) # unique=True 不允许重复

表结构

# 在UserType表插入数据

    obj = models.UserType(caption='管理员')  # 在表中插入数据
obj.save() # 提交进去 models.UserType.objects.create(caption='普通用户') # 在表里插入数据(两种都是在表里插入数据) user_dict = {'caption': '超级管理员'}
models.UserType.objects.create(**user_dict)

UserType表

 # 在UserInfo中插入数据

    user_info_dict = {'user': 'alex',
'email': 'alex3712@qq.com',
'pwd': '',
'user_type': models.UserType.objects.get(nid=) # (获取的是一个对象)获取表UserType的nid=1的数据
}
user_info_dict = {'user': 'even',
'email': 'even3712@qq.com',
'pwd': '',
'user_type': models.UserType.objects.get(nid=) # (获取的是一个对象)获取表UserType的nid=1的数据
} models.UserInfo.objects.create(**user_info_dict) # **表示插入所有

UserInfo表

 一对多之正向查找通过UserInfo表查找UserType的内容, 使用双下划__

    # 正向查找
ret = models.UserInfo.objects.all()
for item in ret:
print(item, item.id, item.user_type.nid, item.user_type.caption, item.user_type_id) # 取出的是对象;输出结果:UserInfo object 1 1 管理员 1 ret1 = models.UserInfo.objects.all().values('user', 'user_type__caption') # user_type__caption中用双下划线是可以连表操作
print(ret1) # 获得是拼接过得 # 拿用户类型是管理员的所有用户
models.UserInfo.objects.filter(user='alex')
models.UserInfo.objects.filter(user_type__caption=1)
ret = models.UserInfo.objects.filter(user_type__caption="管理员").values('user', 'user_type__caption')
print(ret, type(ret))

 一对多之反向查找,通过UserType查找UserInfo的内容, 使用_set

  # 反向查找
obj = models.UserType.objects.filter(caption='管理员').first()
print(obj.nid)
print(obj.caption) # (反向查找)表名_set.all()可以获取; 这种obj.user_type_set()报错,user_type_set:列名_set,不能获得数据
print(obj.userinfo_set.all()) # (反向查找)表名_set.all() 可以获取 obj = models.UserType.objects.get(nid=1) # userinfo__user 双下划线;userinfo表下的user列
ret = models.UserType.objects.all().values('nid', 'caption', 'userinfo__user') # userinfo__user的双下划线,可以关联userinfo表下的user列
print(ret) # 输出结果:[{'userinfo__user': None, 'nid': 2, 'caption': '普通用户'}, ...]

一对多总结

正向查找

filter(跨表)  对象__跨表的字段
line.对象.跨表的字段 反向查找 filter(跨表) 自动创建表名相同的对象__跨表的字段
line.自动创建表名相同的对象_set.filter()/all()

  2.2、一对一

user_info_obj = models.UserInfo.objects.filter(id=1).first()
print user_info_obj.user_type
print user_info_obj.get_user_type_display()
print user_info_obj.userprofile.password user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first()
print user_info_obj.keys()
print user_info_obj.values()

  2.3、多对多

  表结构

有三中创建的方法:

  方法一:传统的多对多(自定义第三张表)

class HostToGroup(models.Model):
hgid = models.AutoField(primary_key=True)
host_id = models.ForeignKey('Host')
group_id = models.ForeignKey('Group') # ForeignKey会创建第三列放入表中 class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32) class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)

  方法二:Django的多对多(自动生成第三张表)

class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32)
# h2g = models.ManyToManyField('Group') # 与下面建立多对多关系是一样的,差别就是放在下面关联表是上面这个Host表 class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=16) h2g = models.ManyToManyField('Host') # 建立多对多关系

  方法三:(自己定义第三张表+ManyToManyField+through字段)

示例:

h2g = models.ManyToManyField('Host', through='HostToGroup')
class HostToGroup(models.Model):
hgid = models.AutoField(primary_key=True)
host_id = models.ForeignKey('Host')
group_id = models.ForeignKey('Group')
status = models.IntegerField() class Host(models.Model):
hid = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=32)
ip = models.CharField(max_length=32)
# h2g = models.ManyToManyField('Group')
# group_set class Group(models.Model):
gid = models.AutoField(primary_key=True)
name = models.CharField(max_length=16)
h2g = models.ManyToManyField('Host', through='HostToGroup')

上面三种都可以创建多对表。

  插入数据

models.Host.objects.create(hostname='c1', ip='1.1.1.1')
models.Host.objects.create(hostname='c2', ip='1.1.1.2')
models.Host.objects.create(hostname='c3', ip='1.1.1.3')
models.Host.objects.create(hostname='c4', ip='1.1.1.4')
models.Host.objects.create(hostname='c5', ip='1.1.1.5')

Host表

    models.Group.objects.create(name='财务部')
models.Group.objects.create(name='人事部')
models.Group.objects.create(name='公关部')
models.Group.objects.create(name='技术部')
models.Group.objects.create(name='运营部')
models.Group.objects.create(name='销售部')
models.Group.objects.create(name='客服部')

Group

  操作表

添加(正、反)

# 将多台机器分配给一个组

    # 1、一个一个添加
# obj = models.Group.objects.get(gid=1)
# h1 = models.Host.objects.get(hid=2)
# obj .h2g.add(h1) # 一个一个添加
# 2、"*"批量添加
# obj = models.Group.objects.get(gid=1)
# q = models.Host.objects.filter(hid__gt=3) # (正向操作)过滤出(__gt=3表示大于3)hid大于3的
# obj.h2g.add(*q) # "*"批量添加 # 将一台机器分给多个组 # 1、一个个添加
# h = models.Host.objects.get(hid=1)
# obj = models.Group.objects.get(gid=1)
# obj.h2g.add(h)
# obj = models.Group.objects.get(gid=2) # 一个个添加
# obj.h2g.add(h) # 2、批量添加
# h = models.Host.objects.get(hid=1)
# h.group_set.add(*models.Group.objects.filter(gid__gt =3) # (反向操作)批量添加

删除

    # 1、remove;删除的是关系表
# h = models.Host.objects.get(hid=1)
# h.group_set.remove(*models.Group.objects.filter(gid__gt=5)) # 反向 # 2、delete;关系表与基础表数据都删除(慎用)
# h = models.Host.objects.get(hid=3)
# h.group_set.all().delete()

设置

   # 1、set ,如果表里没有就添加,如果有就保留
h = models.Host.objects.get(hid=3)
h.group_set.set(models.Group.objects.filter(gid__gt=4)) # 2、参数clear=True表示先进行清空,再添加
h.group_set.set(models.Group.objects.filter(gid__gt=3), clear=True)

增加

 # 1、create 增加一条数据,可以接受字典类型数据

    # 2、get_or_create 如果表里面存在不变,关系表里面没有,那样在基础表与关系表都创建
r = h.group_set.get_or_create(name='公关部')
print(r) # 3、update_or_create 如果关系表里没有,关系表和基础表都添加,如果存在不变(和上面一样)
r = h.group_set.get_or_create(name='销售部')
print(r)

查看

relation_list = models.HostRelation.objects.all()

relation_list = models.HostRelation.objects.filter(c2__username='wang')
for item in relation_list:
print item.c1.hostname
print item.c2.username

其他(Q、F)

    # F 使用查询条件的值
#
# from django.db.models import F
# models.Tb1.objects.update(num=F('num')+1) # Q 构建搜索条件
from django.db.models import Q
# con = Q()
#
# q1 = Q()
# q1.connector = 'OR'
# q1.children.append(('id', 1))
# q1.children.append(('id', 10))
# q1.children.append(('id', 9))
#
# q2 = Q()
# q2.connector = 'OR'
# q2.children.append(('c1', 1))
# q2.children.append(('c1', 10))
# q2.children.append(('c1', 9))
#
# con.add(q1, 'AND')
# con.add(q2, 'AND')
#
# models.Tb1.objects.filter(con) #
# from django.db import connection
# cursor = connection.cursor()
# cursor.execute("""SELECT * from tb where name = %s""", ['Lennon'])
# row = cursor.fetchone()

实例:

用Q 的条件搜索,查询图书的相关信息

from django.conf.urls import url
from django.contrib import admin
from app1 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/', views.test),
url(r'^index/', views.index),
]

urls

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.left{
float: left;
}
.clearfix:after{ // 清除漂浮
content: '.';
clear: both;
display: block;
visibility: hidden;
height: ;
}
</style>
</head>
<body>
<div class="condition">
<div class="item clearfix">
<div class="icon left" onclick="AddCondition(this);">+</div>
<div class="left">
<select onchange="ChangeName(this);">
<option value="name">书名</option>
<option value="book_type__caption">图书类型</option>
<option value="price">价格</option>
<option value="pages">页数</option>
</select>
</div>
<div class="left"><input type="text" name="name" /></div>
</div>
</div>
<div>
<input type="button" onclick="Search();" value="搜索" />
</div> <div class="container"> </div> <script src="/static/jquery-1.12.4.js"></script>
<script>
function AddCondition(ths) {
var new_tag = $(ths).parent().clone(); //复制父标签
new_tag.find('.icon').text('-'); // 在子孙中找,把内容改为“-”
new_tag.find('.icon').attr('onclick', 'RemoveCondition(this);'); // (重新写个事件)把之前绑定的增添事件更新成删除 $(ths).parent().parent().append(new_tag); //添加
}
function RemoveCondition(ths) { // 删除事件
$(ths).parent().remove();
}
function ChangeName(ths) { //修改内容触发这个事件
var v = $(ths).val(); //获得当前选中标签的属性
$(ths).parent().next().find('input').attr('name',v); //select标签,父亲的下一个标签的input找出来,把属性改为“v”
}
function Search() { //搜索事件
var post_data_dict = {}; //获得的值放在这个字典 $('.condition input').each(function () { // 获取所有input的内容,循环一个个获取;提交数据
// console.log($(this)[0]) // ($(this)[0],是把Jquery对象转变成DOM对象
var n = $(this).attr('name'); //这里的this是jQuery对象;获取name属性
var v = $(this).val(); //获取对象的值
var v_list = v.split(','); // 利用分割,得到输入的多个内容
post_data_dict[n] = v_list; //把这些输入值放到字典
});
console.log(post_data_dict); //打印出 var post_data_str = JSON.stringify(post_data_dict); // 把post_data_dict这个字典转换成字符串
$.ajax({
url: '/index/', //这里index后面必须加 "/"
type: 'POST',
data: { 'post_data': post_data_str}, // 要传输默认为字符串,
dataType: 'json', //转换类型
success: function (arg) {
// 字符串 "<table>" +
if(arg.status){
var table = document.createElement('table'); // 成功的话把内容添加到table
table.setAttribute('border', );
// [{,name,pubdate,price,caption},]
$.each(arg.data, function(k,v){ //循环得到返回的内容
var tr = document.createElement('tr'); //创建标签 var td1 = document.createElement('td'); //创建标签
td1.innerText = v['name']; //标签内容
var td2 = document.createElement('td');
td2.innerText = v['price'];
var td3 = document.createElement('td');
td3.innerText = v['book_type__caption'];
var td4 = document.createElement('td');
td4.innerText = v['pubdate'];
tr.appendChild(td1); //标签添加内容
tr.appendChild(td2);
tr.appendChild(td3);
tr.appendChild(td4); table.appendChild(tr);
// 以上都是Dom创建标签和添加标签内容
}); $('.container').empty(); //加之前进行清空
$('.container').append(table); //找到container把table添加进去
}else{
alert(arg.message);
} } })
}
</script>
</body>
</html>

index.html

from django.db import models

# Create your models here.

class Author(models.Model):
"""
作者
"""
name = models.CharField(max_length=)
age = models.IntegerField() class BookType(models.Model):
"""
图书类型
"""
caption = models.CharField(max_length=) class Book(models.Model):
"""
图书
"""
name = models.CharField(max_length=)
pages = models.IntegerField()
price = models.DecimalField(max_digits=, decimal_places=)
pubdate = models.DateField() # authors = models.ManyToManyField(Author)
book_type = models.ForeignKey(BookType) def __str__(self): # 获取内容方便查看
return 'obj:%s-%s' % (self.name, self.price)

models.py

from django.shortcuts import render, HttpResponse
from app1 import models
# Create your views here.
import json
from datetime import date
from datetime import datetime
from decimal import Decimal def test(request): # 插入作者
"""
models.Author.objects.create(name='alex', age=)
models.Author.objects.create(name='eric', age=)
models.Author.objects.create(name='svion', age=)
models.Author.objects.create(name='riok', age=)
models.Author.objects.create(name='vion', age=)
models.Author.objects.create(name='sion', age=)
models.Author.objects.create(name='sdion', age=)
models.Author.objects.create(name='svnn', age=)
models.Author.objects.create(name='aion', age=)
models.Author.objects.create(name='xzon', age=)
"""
# 插入图书类型
"""
models.BookType.objects.create(caption='历史')
models.BookType.objects.create(caption='政治')
models.BookType.objects.create(caption='文学')
models.BookType.objects.create(caption='计算机')
models.BookType.objects.create(caption='小说')
models.BookType.objects.create(caption='故事')
models.BookType.objects.create(caption='语文')
models.BookType.objects.create(caption='数学')
models.BookType.objects.create(caption='科技')
models.BookType.objects.create(caption='化学')
""" # 插入图书
"""
models.Book.objects.create(name='文艺复兴', pages='', price='', pubdate='1992-11-2', book_type_id='')
models.Book.objects.create(name='解密', pages='', price='', pubdate='2016-6-10', book_type_id='')
models.Book.objects.create(name='刀锋', pages='', price='', pubdate='2014-02-16', book_type_id='')
models.Book.objects.create(name='路84号', pages='', price='', pubdate='1999-10-12', book_type_id='')
models.Book.objects.create(name='红楼', pages='', price='', pubdate='1760-1-1', book_type_id='')
models.Book.objects.create(name='将夜', pages='', price='', pubdate='2010-3-3', book_type_id='')
models.Book.objects.create(name='跑路', pages='', price='', pubdate='1998-9-2', book_type_id='')
models.Book.objects.create(name='马克思主义', pages='', price='', pubdate='1937-3-3', book_type_id='')
""" # 查询
# # ret1 = models.Book.objects.filter(book_type__caption='文学').values('name', 'pages', 'price', 'pubdate')
# # print(ret1)
# ret2 = models.Book.objects.filter(authors__name='alex').values('pages', 'price', 'pubdate')
# print(ret2)
# obj2 = models.BookType.objects.filter(book_authors__name='alex').first()
# ret3 = obj2.book_set.values_list('authors__book__name', 'authors__book__price', 'authors__book__pubdate')
# print(ret3)
return HttpResponse("欢迎进入图书馆") class JsonCustomEncoder(json.JSONEncoder): # 固定的格式模块 def default(self, field):
if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field, date):
return field.strftime('%Y-%m-%d')
elif isinstance(field, Decimal):
return str(field)
else:
return json.JSONEncoder.default(self, field) def index(request):
if request.method == 'POST':
ret = {'status': False, 'message': '', 'data': None}
try:
post_data = request.POST.get('post_data', None)
post_data_dict = json.loads(post_data) # 反序列化
print(post_data_dict)
# {'name': ['', 'sdf'],'price': ['', 'sdf']}
# 构造搜索条件(是或的) 搜索内容 返回内容
from django.db.models import Q
con = Q() # 最外层
for k, v in post_data_dict.items():
q = Q()
q.connector = 'OR' # 或的关系
for item in v: # 循环所有的列表如“['', 'sdf']”
q.children.append((k, item)) # item是每一个搜索条件(循环的值),在添加到
con.add(q, 'AND')
"""
ret = models.Book.objects.filter(con)
print(ret) # queryset,[对象] # 使用serializers方法序列化
from django.core import serializers
data = serializers.serialize("json", ret) # 字符串
print(type(data),data) """
"""
# 序列化
# values 内部元素变成字典
# values_list 内部元素变为元祖
#ret = models.Book.objects.filter(con).values('name','book_type__caption') # 这里ret外边是queryset类型;里边的列表类型;遇到values就会变成字典类型
ret = models.Book.objects.filter(con).values_list('name', 'book_type__caption')
print(ret,type(ret))
li = list(ret)
data = json.dumps(li) # 获得后直接序列化
print(data,type(data))
"""
result = models.Book.objects.filter(con).values('name', 'price', 'pubdate', 'book_type__caption')
# ret = models.Book.objects.filter(con).values_list('name', 'book_type__caption') # ret是queryset类型
li = list(result)
ret['status'] = True
ret['data'] = li
except Exception as e: # 错误信息
ret['message'] = str(e) # 错误了就把错误信息放进去
ret_str = json.dumps(ret, cls=JsonCustomEncoder) # cls=JsonCustomEncoder循环每个字段
return HttpResponse(ret_str) # 这里只能返回字符串;把信息返回到前端
return render(request, 'index.html')

views.py

Dom对象与jQuery对象的转换

index.html的关于Dom与jQuery的知识补充

Dom对象与JQuery对象的相互转换:
document.getElementsTagName('div)[0] jQuery对象
$('div').first() Dom对象转换成JQuery对象:
$(document.getElementsTagName('div)[0]) # 直接在Dom对象前加'$' JQuery对象转换成Dom对象:
$('div').first()[0] # 直在jQuery对象后加索引'[0]'

  

总结:

一、一对多
1、创建
对象
_id
2、查找
正向
filter, __跨表
. 跨表
反向
表名_set 二、多对多
1、自动生成关系表
间接的方式获取关系表:
正, 一行数对象.M2M字段
反, 一行数对象.表名_set
2、自定义关系表(推荐)
只对关系表操作 三、select_related
用于优化查询,一次将ForeignKey全部加载内存

  

后续待更新...

Django(进阶篇)之model的更多相关文章

  1. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  3. Django进阶篇(二)

    中间件 解析 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dja ...

  4. django 进阶篇

    models(模型) 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetLi ...

  5. python Django 进阶篇

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  6. Python之路【第十七篇】Django进阶篇

    规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...

  7. Django中级篇之Model专题

    ORM 就是用面向对象的方式去操作数据库的创建表以及增删改查等操作 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据 ...

  8. django进阶篇

    原文连接:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创 ...

  9. Python学习-day20 django进阶篇

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

随机推荐

  1. Xcode6.1标准Framework静态库制作方法。工程转Framework,静态库加xib和图片。完美解决方案。

    http://www.cocoachina.com/bbs/read.php?tid-282490.html Xcode6.1标准Framework静态库制作方法.工程转Framework,静态库加x ...

  2. DeepLearning之路(三)MLP

    DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解 @author:wepon @blog:http://blog.csdn.net/u012162613/articl ...

  3. select document library from certain list 分类: Sharepoint 2015-07-05 07:52 6人阅读 评论(0) 收藏

    S using System; using Microsoft.SharePoint; namespace Test { class ConsoleApp { static void Main(str ...

  4. Android M新特性之Permissions

    User does not have to grant any permissions when they install or upgrade the app. Instead, the app r ...

  5. QT中QWS的含义 (转至 宋金时的专栏

    QT 编程和文档中的术语QWS的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS ...

  6. animate.css总结

    本文对animate.css的各个效果进行总结 bounce 从上掉落,在地上小幅度跳起 <!DOCTYPE html> <meta charset="utf-8" ...

  7. VC++ 文件系统

    using namespace System; using namespace System::IO; void ShowHelpMsg(){ Console::WriteLine(L"本程 ...

  8. OpenSSL - RSA非对称加密实现

    非对称加密:即两端使用一对不同的密钥进行加密. 在非对称加密中,需要两对密钥,公钥和私钥. 公钥个私钥属于对立关系,一把加密后,只有另一把才可以进行解密. 公钥数据加密 数字证书内包含了公钥,在进行会 ...

  9. Gym 100818G (模拟退火)

    题目大意 给一张n个点的无向图,要求给每个点染色0或1,使得每个点的相邻相同颜色点的数量小于等于其度数的一半. 解题分析 没想到什么好的算法,就随机乱搞了. 若某个状态时,一个点的度数为cnt,相邻相 ...

  10. GO RPC

    HTTP RPC SERVER CODE package main import ( "errors" "fmt" "net/http" & ...