西安东郊网站建设,首页标题在哪里打开,做英文网站地图,免费推广appDjango-Model操作数据库(增删改查、连表结构)一、数据库操作1、创建model表基本结构from django.db importmodelsclassuserinfo(models.Model):#如果没有models.AutoField#xff0c;默认会创建一个id的自增列name models.CharField(max_length 30)emailmodels.EmailField()…Django-Model操作数据库(增删改查、连表结构)一、数据库操作1、创建model表基本结构from django.db importmodelsclassuserinfo(models.Model):#如果没有models.AutoField默认会创建一个id的自增列name models.CharField(max_length 30)emailmodels.EmailField()memo models.TextField()更多字段1 、models.AutoField 自增列 int ( 11)如果没有的话默认会生成一个名称为 id 的列如果要显示的自定义一个自增列必须将给列设置为主键 primary_keyTrue 。2、models.CharField 字符串字段必须 max_length 参数3 、models.BooleanField 布尔类型 tinyint( 1)不能为空BlankTrue4 、models.ComaSeparatedIntegerField 用逗号分割的数字 varchar继承CharField所以必须 max_lenght 参数5、models.DateField 日期类型 date对于参数auto_nowTrue 则每次更新都会更新这个时间auto_now_add 则只是第一次创建添加之后的更新不再改变。6、models.DateTimeField 日期类型 datetime同DateField的参数7 、models.Decimal 十进制小数类型 decimal必须指定整数位max_digits和小数位decimal_places8 、models.EmailField 字符串类型(正则表达式邮箱) varchar对字符串进行正则表达式9 、models.FloatField 浮点类型 double10、models.IntegerField 整形11、models.BigIntegerField 长整形integer_field_ranges{‘SmallIntegerField‘ :( - 32768 , 32767),‘IntegerField‘ :( - 2147483648 , 2147483647),‘BigIntegerField‘ :( - 9223372036854775808 , 9223372036854775807),‘PositiveSmallIntegerField‘ :( 0 , 32767),‘PositiveIntegerField‘ :( 0 , 2147483647),}12、models.IPAddressField 字符串类型(ip4正则表达式)13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)参数protocol可以是both、ipv4、ipv6验证时会根据设置报错14、models.NullBooleanField 允许为空的布尔类型15、models.PositiveIntegerFiel 正Integer16、models.PositiveSmallIntegerField 正smallInteger17、models.SlugField 减号、下划线、字母、数字18、models.SmallIntegerField 数字数据库中的字段有tinyint、smallint、 int 、bigint19 、models.TextField 字符串 longtext20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]21、models.URLField 字符串地址正则表达式22、models.BinaryField 二进制23、models.ImageField图片24 、models.FilePathField文件更多参数1 、null True数据库中字段是否可以为空2 、blank Truedjango的Admin中添加数据时是否可允许空值3 、primary_key False主键对AutoField设置主键后就会代替原来的自增 id 列4、auto_now 和 auto_now_addauto_now 自动创建- - -无论添加或修改都是当前操作的时间auto_now_add 自动创建- - -永远是创建时的时间5、choicesGENDER_CHOICE((u‘M‘ , u ‘Male‘),(u‘F‘ , u ‘Female‘),)gender models.CharField(max_length 2 ,choices GENDER_CHOICE)6、max_length7、default 默认值8、verbose_name Admin中字段的显示名称9 、name|db_column 数据库中的字段名称10 、unique True 不允许重复11 、db_index True 数据库索引12 、editable True 在Admin里是否可编辑13 、error_messages None 错误提示14 、auto_created False 自动创建15、help_text 在Admin中提示帮助信息16 、validators []17 、upload - to2、注册APPsettings添加app3、生成相应的表python manage.py makemigrationspython manage.py migrate4、admin后台注册表python manage.py createsuperuser 创建用户后台可以管理添加数据对数据进行增删改查查models.UserInfo.objects.all()models.UserInfo.objects.all().values(‘user‘) #只取user列models.UserInfo.objects.all().values_list(‘id‘,‘user‘) #取出id和user列并生成一个列表models.UserInfo.objects.get(id1)models.UserInfo.objects.get(user‘yangmv‘)成功获取数据增models.UserInfo.objects.create(user‘yangmv‘,pwd‘123456‘)或者obj models.UserInfo(user‘yangmv‘,pwd‘123456‘)obj.save()或者dic {‘user‘:‘yangmv‘,‘pwd‘:‘123456‘}models.UserInfo.objects.create(**dic)删models.UserInfo.objects.filter(user‘yangmv‘).delete()改models.UserInfo.objects.filter(user‘yangmv‘).update(pwd‘520‘)或者obj models.UserInfo.objects.get(user‘yangmv‘)obj.pwd ‘520‘obj.save()常用方法#获取个数##models.Tb1.objects.filter(name‘seven‘).count()#大于小于##models.Tb1.objects.filter(id__gt1) # 获取id大于1的值#models.Tb1.objects.filter(id__lt10) # 获取id小于10的值#models.Tb1.objects.filter(id__lt10, id__gt1) # 获取id大于1 且 小于10的值#in##models.Tb1.objects.filter(id__in[11, 22, 33]) # 获取id等于11、22、33的数据#models.Tb1.objects.exclude(id__in[11, 22, 33]) # not in#contains##models.Tb1.objects.filter(name__containsven)#models.Tb1.objects.filter(name__icontainsven) # icontains大小写不敏感#models.Tb1.objects.exclude(name__icontainsven)#range##models.Tb1.objects.filter(id__range[1, 2]) # 范围bettwen and#其他类似##startswithistartswith, 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 byfrom django.db.models importCount, Min , Max , Sum#models.Tb1.objects.filter(c11).values(‘id‘).annotate(cCount(‘num‘))#SELECT app01_tb1.id, COUNT(app01_tb1.num) AS c FROM app01_tb1 WHERE app01_tb1.c1 1 GROUP BY app01_tb1.iddjango中models的filter过滤方法__gt大于__gte大于等于__lt小于__lte小于等于__in存在于一个list范围内__startswith以...开头__istartswith以...开头忽略大小写__endswith以...结尾__iendswith以...结尾忽略大小写__range在...范围内__year日期字段的年份__month日期字段的月份__day日期字段的日__isnullTrue/False__overlap集合至少有一个元素重合__contains集合包含__regex 匹配正则表达二、常用字段models.DateTimeField 日期类型 datetime参数auto_now True 则每次更新都会更新这个时间auto_now_add 则只是第一次创建添加之后的更新不再改变。classUserInfo(models.Model):name models.CharField(max_length 32)ctime models.DateTimeField(auto_now True )uptime models.DateTimeField(auto_now_add True )from web importmodelsdefhome(request):models.UserInfo.objects.create(name ‘yangmv‘)aftermodels.UserInfo.objects. all ()printafter[ 0 ].ctimereturn render(request, ‘home/home.html‘ )表结构的修改表结构修改后原来表中已存在的数据就会出现结构混乱makemigrations更新表的时候就会出错解决方法1、新增加的字段设置允许为空。生成表的时候之前数据新增加的字段就会为空。(nullTrue允许数据库中为空blankTrue允许admin后台中为空)2、新增加的字段设置一个默认值。生成表的时候之前的数据新增加字段就会应用这个默认值执行makemigrations migrate 后。老数据会自动应用新增加的规则models.ImageField 图片models.GenericIPAddressField IPip models.GenericIPAddressField(protocolipv4,nullTrue,blankTrue)img models.ImageField(nullTrue,blankTrue,upload_toupload)数据库中保存的只是图片的路径常用参数选择下拉框 choicesclassUserInfo(models.Model):USER_TYPE_LIST((1,‘user‘),(2,‘admin‘),)user_type models.IntegerField(choicesUSER_TYPE_LIST,default1)2、连表结构一对多models.ForeignKey(其他表)多对多models.ManyToManyField(其他表)一对一models.OneToOneField(其他表)应用场景一对多当一张表中创建一行数据时有一个单选的下拉框(可以被重复选择)例如创建用户信息时候需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。多对多在某表中创建一行数据是有一个可以多选的下拉框例如创建用户信息需要为用户指定多个爱好一对一在某表中创建一行数据时有一个单选的下拉框(下拉框中的内容被用过一次就消失了例如原有含10列数据的一张表保存相关信息经过一段时间之后10列无法满足需求需要为原来的表再添加5列数据一对多classGame(models.Model):gname models.CharField(max_length 32)classHost(models.Model):hostname models.CharField(max_length 32)game models.ForeignKey( ‘Game‘ )这是Game表里面有3个业务这是主机表可以通过外键对应到Game表的业务的ID多对多classUserGroup(models.Model):group_name models.CharField(max_length 16)classUser(models.Model):name models.CharField(max_length 16)sex models.CharField(max_length 16)email models.EmailField(max_length 32)usergroup_user models.ManyToManyField( ‘UserGroup‘ )Django model会自动创建第3张关系表用于对应user id 和usergroup id这是UserGroup表这是User表这是Django自动生成的对应关系表user_id 1 为 yangmv同时属于1,2(技术部运营部)一对一 (一对多增加了不能重复)classUser2(models.Model):name models.CharField(max_length 16)sex models.CharField(max_length 16)email models.EmailField(max_length 32)classAdmin(models.Model):username models.CharField(max_length 32)password models.CharField(max_length 32)admin_user2 models.OneToOneField( ‘User2‘ )连接MysqlDATABASES {‘default‘:{‘ENGINE‘ : ‘django.db.backends.mysql‘,‘NAME‘ : ‘dbname‘,‘USER‘ : ‘root‘,‘PASSWORD‘ : ‘xxx‘,‘HOST‘ :‘‘,‘PORT‘ :‘‘,}}一对多操作实例首先生成2个表from django.db importmodelsclassGroup2(models.Model):caption models.CharField(max_length 32)classUser2(models.Model):username models.CharField(max_length 32)group2 models.ForeignKey( ‘Group2‘)input和select标签用forms生成先执行create_group生成3个group已经查询出Group数据添加方法1方法2defcreate_user(request):objForign.UserForm(request.POST)if request.method ‘POST‘:ifobj.is_valid():all_dataobj.clean()#print all_data#获取提交页面提交来的数据{‘username‘: u‘yang1‘, ‘usergroup‘: 1}#方法1先获取对象添加#group_obj models.Group2.objects.get(idall_data[‘usergroup‘])#models.User2.objects.create(usernameall_data[‘username‘],usergroupgroup_obj)#方法2(推荐)models.User2.objects.create(username all_data[ ‘username‘ ],group2_id all_data[ ‘usergroup‘])#django会自动把数据库group2变为group2_idelse:errorobj.errorsprint error[ ‘username‘][ 0 ]print error[ ‘usergroup‘][ 0 ]return render(request, ‘forign/create_user.html‘ ,{ ‘obj‘ :obj})方法3defcreate_user(request):objForign.UserForm(request.POST)if request.method ‘POST‘:ifobj.is_valid():all_dataobj.clean()#print all_data#获取提交页面提交来的数据{‘username‘: u‘yang1‘, ‘usergroup‘: 1}#方法1先获取对象添加#group_obj models.Group2.objects.get(idall_data[‘usergroup‘])#models.User2.objects.create(usernameall_data[‘username‘],usergroupgroup_obj)#方法2(推荐)#models.User2.objects.create(usernameall_data[‘username‘],group2_idall_data[‘usergroup‘])#django会自动把数据库group2变为group2_id#方法3(推荐)models.User2.objects.create( * *all_data)printmodels.User2.objects. all ().count()else:pass#error obj.errors#print error[‘username‘][0]#print error[‘usergroup_id‘][0]return render(request, ‘forign/create_user.html‘ ,{ ‘obj‘ :obj})查询。展示出所有的数据defcreate_user(request):objForign.UserForm(request.POST)if request.method ‘POST‘:ifobj.is_valid():all_dataobj.clean()#方法3(推荐)models.User2.objects.create( * *all_data)printmodels.User2.objects. all ().count()else:passuser_listmodels.User2.objects. all ()return render(request, ‘forign/create_user.html‘ ,{ ‘obj‘ :obj, ‘user_list‘ :user_list}) table border1{% for item in user_list %} tr td {{ item.username }} td td {{ item.group2.caption }} td tr {% endfor %} table GET方式查询defcreate_user(request):objForign.UserForm(request.POST)if request.method ‘POST‘:ifobj.is_valid():all_dataobj.clean()#方法3(推荐)models.User2.objects.create( * *all_data)printmodels.User2.objects. all ().count()else:pass#查用户get_user request.GET.get( ‘username‘)user_list models.User2.objects. filter (username get_user)return render(request, ‘forign/create_user.html‘ ,{ ‘obj‘ :obj, ‘user_list‘:user_list})#查组get_val request.GET.get( ‘group‘)user_list models.User2.objects. filter (group2__caption get_val)一对多跨表操作总结1、group2对应的是一个对象2、创建数据 group2_id 直接查询数据库3、获取数据通过. group2.caption4、查询数据通过__ group2__caption