Django中表与字段的定义
- 在app文件夹下models.py中建立表与字段
#这里定义表和字段后将以user_user的形式(app名+类名)
class User(models.Model):
#AutoField相当于int类型auto_increment自增约束
id = models.AutoField(primary_key=True)
#CharField相当于varchar类型
username = models.CharField(max_length=16)
password = models.CharField(max_length=16)
#PositiveSmallIntegerField相当于tinyint
gender = models.PositiveSmallIntegerField()
#IntegerField相当于int类型
age = models.IntegerField()
#DateTimeField相当于datetime
createDatetime = models.DateTimeField()
Django支持的常用字段类型
字段类型关键字 | 说明 |
---|---|
AutoField | 自动增长的整数(相当于:int auto_increment)说明:常用的参数:primary_key=True(定于主键) 如果不写id = models.AutoField(primary_key=True) ,Django 也会创建一个自增的主键id |
IntegerField | 整数int |
FloatField | 浮点数 ,必填参数:max_digits:最大总位数,decimal_places:小数位数 |
Decimal | 定点数,必填参数:max_digits:最大总位数,decimal_places:小数位数 |
CharField | 字符串varchar(),必填参数:max_length:最大长度 |
TextField | 大文本Text |
BooleanField | True/False |
DateTimeField | 日期Datetime:YYYY-MM-DD HH:MM:SS(常用参数):auto_now:每次修改对象,自动设置时间,auto_now_add:第一次被创建,自动设置时间 |
EmailField | 邮箱 |
ImageField | 图片 |
关键字 | 说明 | 默认值 |
---|---|---|
primary_key | 是否是主键 | False |
null | 能否为空 | False |
unique | 能否重复 | False |
default | 默认值 | False |
blank | 在Django管理后天新增或编辑一条表数据时,该字段能否为空,null是数据库范畴,blank是表单验证范畴 | False |
定义完整模型类
from django.db import models
import datetime
# Create your models here.
#这里定义表和字段后将以user_user的形式(app名+类名)
class User(models.Model):
#CharField相当于varchar类型
username = models.CharField(max_length=16,unique=True)
password = models.CharField(max_length=16)
#PositiveSmallIntegerField相当于tinyint
gender = models.PositiveSmallIntegerField(default=0)
#IntegerField相当于int类型
age = models.IntegerField(null=True)
#DateTimeField相当于datetime
createDatetime = models.DateTimeField(auto_now_add=datetime.datetime.now())
数据库的迁移与维护
生成迁移文件:
python manage.py makemigrations
执行迁移文件
python manage.py migrate
模型类的增删改
- 模型类
class User(models.Model):
#CharField相当于varchar类型
username = models.CharField(max_length=16,unique=True)
password = models.CharField(max_length=16,default='123456')
#PositiveSmallIntegerField相当于tinyint
gender = models.PositiveSmallIntegerField(default=0)
new = models.CharField(max_length=10,null=True)
#IntegerField相当于int类型
age = models.IntegerField(null=True)
#DateTimeField相当于datetime
createDatetime = models.DateTimeField(auto_now_add=datetime.datetime.now())
-
交互式编程
交互式:
python manage.py shell导入user中的模型类
> from user。models import*
退出:
exit -
增加数据
save方法
user = User()
user.username = ‘name1’
user.iduser.save()
user.id
1
- 修改数据
修改user用户的密码为pass1
user.password = ‘pass1’
user.save()
注释:如果模型类中id没有值,为新增数据
如果模型类中id有值,为修改数据
- 删除数据
删除user对应数据库中的数据
user.delete()
原理是根据id来删除
- 其他的增删改
增加:
user=User.objects.create(
username = ‘name2’
)
相当于:
user = User(username = ‘name2’)
user.save()
修改:
User.objects.filter(条件).update(属性=属性值)
例如:
User.objects.filter(id=2).update(password=‘pass2’)
删除:
User.objects.filter(id=2).delete()
模型类的查询方法
- 查询语法格式
- 比较查询
- 模糊查询
- 范围查询
- F对象和Q对象
1. 查询语法格式
格式:
模型类名字.objects.方法(条件)
例如:
user = User.objects.get(id=1)
方法 | 说明 |
---|---|
all() | 返回所有 |
get(条件) | 返回满足条件的数据 |
filter(条件) | 返回满足条件的数据 |
exclude(条件) | 返回不满足条件的数据 |
注:
get方法必须返回一个对象
如果没有满足条件的对象,或者有多个满足条件的对象,都会报异常
all、filter、exclude返回的结果类型是QuerySet(类似列表)
例如:
user= User.objects.all()
user=User.objects.filter(id=1)
user=User.objects.exclude(id=1)
2.比较查询
条件 | 说明 |
---|---|
相等 | exact |
大于 | gt |
大于等于 | gte |
小于 | lt |
小于等于 | lte |
为空查询 | isnull |
条件格式:
字段名__条件关键字 = 比较值
例如:
查询id >=2的所有用户
users = User.objects.filter(id__gte=2)
3. 模糊查询
条件 | 说明 |
---|---|
包含 | contains |
开头 | startswith |
结尾 | endswith |
例如:
from user.models import *
# 查询用户命中包含'1'的用户
user1_s = User.objects.filter(username__contains='1')
print(user1_s)
# 查询用户名以'name1'开头的用户
user2_s = User.objects.filter(username__startswith='name1')
print(user2_s)
# 查询邮箱以'@qq.com'结尾的用户
user3_s = User.objects.filter(email__endswith='@qq.com')
print(user3_s)
4.范围查询
条件 | 说明 |
---|---|
范围 | in |
例如:
查询username属于[‘name1’,‘name2’]的user对象
users = User.objects.filter(username_in = [‘name1’,‘name2’])
5. F对象和Q对象
if __name__ == '__main__':
main()
from user.models import *
from django.db.models import F
# 查询在第一次创建后,发生修改的对象
user_s = User.objects.filter(updateDatetime__gt = F('createDatetime'))
for user1 in user_s:
print(user1)
if __name__ == '__main__':
main()
from user.models import *
from django.db.models import Q
#查询余额大于5000块的男性
print(User.objects.filter(money__gt=5000,gender=0)) #第一种 逗号表示与
print(User.objects.filter(Q(money__gt=5000)& Q(gender=0))) #第二种 Q(条件)&Q(条件)
#查询余额大于5000块的男性和余额大于2000块的女性
print(User.objects.filter(Q(money__gt = 5000)&Q(gender=0)|Q(money__gt = 2000)& Q(gender=1)))