Python之路-(Django进阶二)
model:
双下划线:
# 获取个数 # # models.Tb1.objects.filter(name='seven').count() # 大于,小于 # # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 # models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值
关键字:
字段的参数: null -> db是否可以为空 default -> 默认值 primary_key -> 主键 db_column -> 列名 db_index -> 索引 unique -> 唯一索引 unique_for_date -> 时间 unique_for_month ->月 unique_for_year ->年 auto_now -> 创建时,自动生成时间 auto_now_add -> 更新时,自动更新为当前时间 choices -> django admin中显示下拉框,避免连表查询 blank -> django admin是否可以为空 verbose_name -> django admin显示字段中文 editable -> django admin是否可以被编辑 error_messages -> 错误信息欠 help_text -> django admin提示 validators -> django form ,自定义错误信息(欠)
外键操作:
说到外键,我们并不陌生,之前我们学过sqlalchemy,为了减少输入的重复性,下面我们来看看django的外键操作:
首先,我们要更新我们的数据库,因为是外键所以必须是多个表之间的关系。
from django.db import models # Create your models here. #外键,用户组织架构信息 class user_group(models.Model): #主键 uid = models.AutoField(primary_key=True) caption = models.CharField(max_length=128,db_index=True) #用户名基本信息 class UserInfo(models.Model): username = models.CharField(max_length=32,db_index=True) password = models.CharField(max_length=64,db_index=True) email = models.EmailField() tel = models.IntegerField() u_group = models.ForeignKey(to='user_group',to_field='uid')
外键的查询
u_group字段其实是一个query.set类型,也就说u_group.uid和u_group.caption就直接查到了第二张表的这行数据,如果是还有关联(外键),可以继续点。如果不想跨表查询u_group地段的数据名称是u_group_id,默认django加的。
#如上表的示例: user_list = models.UserInfo.objects.all() for row in user_list: print(row.username,row.password,row.email,row.tel,row.u_group.caption,row.u_group.uid)
多对多:
创建方式一(自定义关系表):
class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id') # 10 class Application(models.Model): name = models.CharField(max_length=32) # 2 class HostToApp(models.Model): hobj = models.ForeignKey(to='Host',to_field='nid') aobj = models.ForeignKey(to='Application',to_field='id') # HostToApp.objects.create(hobj_id=1,aobj_id=2)
创建方式二(自动创建关系表):
class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = models.CharField(max_length=32,db_index=True) ip = models.GenericIPAddressField(protocol="ipv4",db_index=True) port = models.IntegerField() b = models.ForeignKey(to="Business", to_field='id') # 10 class Application(models.Model): name = models.CharField(max_length=32) r = models.ManyToManyField("Host")
扩展
数据库操作的多种方式:
增加:
方式一(常用):models.User.objects.create(name='张三',age=18)
方式二:dic = {'name': 'xx', 'age': 19}
models.User.objects.create(**dic)
方式三:obj = models.User(name='张三',age=18)
obj.save()
删除
models.User.objects.filter(id=1).delete()
改(id字段大于一)
方式一:models.User.objects.filter(id__gt=1).update(name='张三',age=22)
方式二 dic = {'name': 'xx', 'age': 19}
models.User.objects.filter(id__gt=1).update(**dic)
查询(gt大于,lt小于,get大于等于,lte小于等于)
models.User.objects.filter(id=1,name='root')
models.User.objects.filter(id__gt=1,name='root')
models.User.objects.filter(id__lt=1)
models.User.objects.filter(id__gte=1)
models.User.objects.filter(id__lte=1)
models.User.objects.filter(id=1,name='root')
dic = {'name': 'xx', 'age__gt': 19}
models.User.objects.filter(**dic)
牢记:
# QuerySet ,内部元素都是对象。html中for循环后直接点查询字段就行 {{ row.id }} {{ row.caption }}
v1 = models.Business.objects.all()
value和values_list的好处是根据自己的需求取出字段,而不会将数据库所有数据取出。
# QuerySet ,内部元素都是字典
v2 = models.Business.objects.all().values('id','caption')
# QuerySet ,内部元素都是元组。html中for循环后只能用元祖索引取值比如,{{ row.0 }} {{ row.1 }}
v3 = models.Business.objects.all().values_list('id','caption')
# 获取到的一个对象,如果不存在就报错
models.Business.objects.get(id=1)
可以这么用v4 = models.Business.objects.filter(id=1).first()
如果没有数据就返回None,不至于程序崩溃
外键:
v = models.Host.objects.filter(nid__gt=0)
v[0].b.caption ----> 通过.进行跨表
详解.all和.all.values()及.all.values_list用法
views:
def test(request): v1 = models.UserInfo.objects.all() v2 = models.UserInfo.objects.all().values('id','username','user_group__caption')#注意cation是两个下划线 v3 = models.UserInfo.objects.all().values_list('id','username','user_group__caption') for row in v3: print(row[0],row[1],row[2]) return render(request,'test.html',{'v1':v1,'v2':v2,'v3':v3})
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <table> <tbody> <tr> <td>点all</td> </tr> {% for row in v1 %} <tr> <td>{{ row.id }} </td> <td>{{ row.username }} </td> <td>{{ row.user_group.caption }} </td> </tr> {% endfor %} </tbody> </table> <h1></h1> <table> <tbody> <tr> <td>点values</td> </tr> {% for row in v2 %} <tr> <td>{{ row.id }} </td> <td>{{ row.username }} </td> <td>{{ row.user_group__caption }} </td> </tr> {% endfor %} </tbody> </table> <h1></h1> <table> <tbody> <tr> <td>点values_list</td> </tr> {% for row in v3 %} <tr> <td>{{ row.0 }} </td> <td>{{ row.1 }} </td> <td>{{ row.2 }} </td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
展示: