python中model.py详解
model详解
Django中遵循 Code Frist 的原则,即:根据代码中定义的类来⾃动⽣成数据库表。
创建表
基本结构
from django.db import models
# Create your models here.
class userinfo(models.Model): nid = models.AutoField(primary_key=True) username = models.CharField(max_length=32) email = models.EmailField() ip = models.更多字段:
1、models.AutoField  ⾃增列 = int(11)
  如果没有的话,默认会⽣成⼀个名称为 id 的列,如果要显⽰的⾃定义⼀个⾃增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)   不能为空,Blank=True
4、models.ComaSepa 更多参数:
1、null=True
python新手代码userid  数据库中字段是否可以为空
2、blank=True   django的 Admin 中添加数据时是否可允许空值
3、primary_key = False   主键,对AutoField设置主键后,就会代替原来的⾃增 id 列
4、auto_n 连表结构
1. ⼀对多:models.ForeignKey(其他表)
2. 多对多:models.ManyToManyField(其他表)
3. ⼀对⼀:models.ManyToManyField(其他表)
应⽤场景:
应⽤场景:
⼀对多:当⼀张表中创建⼀⾏数据时,有⼀个单选的下拉框(可以被重复选择)
例如:创建⽤户信息时候,需要选择⼀个⽤户类型【普通⽤户】【⾦牌⽤户】【铂⾦⽤户】等。
多对多:在某表中创建⼀⾏数据是,有⼀个可以多选的下拉框
例如:创建⽤户信息,需要为⽤户指定多个爱好
⼀对⼀:在某表中创建⼀⾏数据时,有⼀个单选的下拉框(下拉框中的内容被⽤过⼀次就消失了
例如:原有含10列数据的⼀张表保存相关信息,经过⼀段时间之后,10列⽆法满⾜需求,需要为原来的表再添加5列数据
看个例⼦:
from django.db import models
# Create your models here.
from django.db import models # 陈超,普通⽤户 # 淮军,超级⽤户class Gender(models.Model): name = models.CharField(max_length=32) class userinfo TIPS:
1. modles.py中class设置的数据,本⾝返回为⼀个类,如果想直接返回某⼀个字段的值,可以定义__str__,⽐如:
class TypeUser(models.Model): name = models.CharFiled(max_length=32) def __str__(self): return self.name
2. 在设置ForeignKey时,参数中的第⼀个参数为表名,**需要注意的是,加不加引号有区别:加引号后表的定义顺序可以随便,但不加引号必须按照顺序来:
class userinfo(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=30, verbose_name='⽤户名',editable=
3. 多对多,有两种创建⽅式
1. ⾃建第三张表
2. ⾃动创建,⽐如:
#⾃建第三张表
class B2G(models.Model): boy = models.ForeignKey('Boy') girl = models.ForeignKey('Girl') class Boy(models.Model): name = models.CharField(
4. queryset
从数据库中提取出来的数据为queryset类型,是Django中的⼀种特殊类型.
w = models.Simp.objects.all()
print(w, type(w))
[<Simp: chenc>, <Simp: zan>, <Simp: zhangsan>]<class 'dels.query.QuerySet'>
可以看到,从数据库取出个数据看起来像包含对象的列表。⽽实际上整个数据为django中的特殊类型QuerySet。
如果需要查看原来的SQL语句,可以使⽤queryset.query:
print(w.query)
5. values() 和 vlue_list() 与 all()区别
.all()是取得所有列的数据,可以加.values()取出某⼀列,每⼀个元素为⼀个字典:
obj = model.UserInfo.objects.filter(name='alex').values('id','email')
# select id from userinfo where name = 'alex' queryset -> python,Django的类 [{'id':1},{'id': 2},]
values_list(),获取到的元素为⼀个个元组,也可以加多个参数来获取多列:
obj = model.UserInfo.objects.filter(name='alex').value_list('id','email') # select id from userinfo where name = 'alex' queryset -> python,Django的类 [(
表操作
基本操作
# 增
#
# models.ate(c1='xx', c2='oo')  增加⼀条数据,可以接受字典类型数据 **kwargs
# obj = models.Tb1(c1='xx', c2='oo') # obj.save() # 查 # # models.(id=123) # 获取单条数据,不存在则报错(不建议) # models.Tb1.objects.all() #进阶操作(了不起的双下划线)
利⽤双下划线将字段和对应的操作连接起来
# 获取个数
#
# models.Tb1.objects.filter(name='seven').count()
# ⼤于,⼩于 # # models.Tb1.objects.filter(id__gt=1) # 获取id⼤于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id⼩于10的值 # models.Tb1.objects.filter(id__连表操作(了不起的双下划线)
利⽤双下划线和 _set 将表之间的操作连接起来
数据库表结构:
class UserProfile(models.Model): user_info = models.OneToOneField('UserInfo') username = models.CharField(max_length=64) password = models.CharField(ma ⼀对⼀操作:
user_info_obj = models.UserInfo.objects.filter(id=1).first()
print user_info_obj.user_type
print user__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.
⼀对多操作,类似于⼀对⼀:
1、搜索条件使⽤ __ 连接
2、获取值时使⽤ .    连接
多对多操作:
user_info_obj = models.(name=u'武沛齐')
user_info_objs = models.UserInfo.objects.all()
group_obj = models.(caption='CEO')
group_objs = models.UserGroup.objects.all()
# 添加数据
#group_obj.user_info.add(user_info_obj) #group_obj.user_info.add(*user_info_objs) # 删除数据 #group_obj.ve(user_info_obj) #group_obj.user_info 其他操作:
# F 使⽤查询条件的值
#
# from dels import F
# models.Tb1.objects.update(num=F('num')+1) # Q 构建搜索条件 from dels import Q # con = Q() # # q1 = Q() # q1.connector = 'OR' # q1.children. xx_set中的_set是多对多的固定搭配
扩展
⾃定义上传
def upload_file(request): hod == "POST": obj = ('fafafa') f = open(obj.
name, 'wb') for chunk in obj.chunks(): f.write(chunk) f.close() form上传⽂件实例
class FileForm(forms.Form): ExcelFile = forms.FileField()
models.py:
from django.db import models
class UploadFile(models.Model): userid = models.CharField(max_length = 30) file = models.FileField(upload_to = './upload/') date = models.DateTimeField(
view.py:
def UploadFile(request): uf = AssetForm.FileForm(request.POST,request.FILES) if uf.is_valid(): upload = models.UploadFile() upload.userid = 1 upload.file = uf.cle

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。