模型是基于ORM设计思想
ORM (对象关系映射)
class Student(models.Model):
pass
CharField varchar
FileField varchar
TextField longtext
BinaryField longblob
IntegerField int
AutoField int
FloatField float/double
DecimalField decimal
DateField date
DateTimeField datetime
TimeField time
BooleanField boolean
OneToOneField
ForeignKey
ManyToManyField
属性名 | 说明 | 默认值 |
---|---|---|
verbose_name | 属性的标签名、影响的是 admin站点网页 | None |
name | 设置属性名、name会修改属性的名称, 不常用 | None |
primary_key | 设置属性是否是主键、影响数据库 | False |
max_digits | 针对字符串、设置最大长度 | None |
unique | 设置属性是否唯一,影响数据库 | False |
blank | 设置属性是否为空、影响网页校验效果 | False |
null | 设置属性是否为空,影响的是数据库 | False |
default | 设置属性的默认值、影响数据库 | NOT_PROVIDED |
editable | 是否允许修改、影响网页 | True |
choices | 设置值的选项、对应一个下拉列表效果 | None |
help_text | 帮助文本、属性的提示信息、影响网页效果 | None |
db_column | 设置属性对应的数据库字段名、默认值和属性名保持一致 | 属性名 |
auto_created | 设置属性是否自动增长、一般配合主键使用 | False |
validators | 设置属性的校验规则 | None |
error_messages | 校验失败的提示信息 | None |
属性名 | 属性描述 | 默认值 |
---|---|---|
upload_to | 设置文件上传的存储位置 | 空字符串 |
storage | 设置上传文件的存储引擎 | None |
属性名 | 属性描述 | 默认值 |
---|---|---|
max_digits | 最大有效数字的位数 | None |
decimal_places | 小数点后保留几位小数 | None |
属性名 | 属性描述 | 默认值 |
---|---|---|
auto_now | 设置是否采用当前系统时间作为属性的值 | False |
属性名 | 属性描述 | 默认值 | 是否必传 | 备注 |
---|---|---|---|---|
to | 设置关系属性指向的模型类、如果指向自己,使用 “self” | Y | ||
on_delete | 指定当删除数据的时候,时候级联删除父数据 | models.DO_NOTHING models.CASCADE | Y | |
null | 是否允许为空 | N | 推荐使用 null=True | |
blank | 页面是否必传 | N | 推荐使用 blank=True | |
related_name | 在关系方维护自己的属性 | N |
class Student(models.Model):
"""
一个模型类、对应数据库的一张表, 表名 默认是 应用名_模型名
django中的模型 会自动生成一个 主键 且 属性名为 id,
如果模型中自己定义了主键、则 django 不在自动生成 id主键
"""
name = models.CharField(max_length=100, verbose_name="学生名", blank=False, null=True)
# choices 是一个 二维元组, ('m', '男') ==> 数据库存放的是 m , 页面显示的是 男
# choices 对应页面的下拉列表 <select> <option value="m">男</option><option value="f">女</option></select>
sex = models.CharField(max_length=1, verbose_name="性别", default="m", choices=(("m", "男"), ("f", "女")))
birth = models.DateField(verbose_name="出生日期", null=True, blank=True, db_column="birthday")
tel = models.CharField(max_length=11, verbose_name="手机号", null=True, blank=True)
email = models.EmailField(verbose_name="邮箱", null=True, blank=True)
# auto_now 如果为 true, 新增、修改 都会改变这个值并且取当前系统时间, 默认值default 只影响插入
create_time = models.DateTimeField(default=timezone.now, verbose_name="入学时间")
score = models.FloatField(null=True, blank=True)
class Meta:
# 指定模型类对应的表名,默认是应用名_模型名
db_table = "t_student"
python manage.py check appName
python manage.py makemigrations appName
python manage.py sqlmigrate appName 迁移文件的编号
# 生成django项目所有的应用下的所有模型对应的表
python manage.py migrate
# 只执行 appName 应用下的迁移文件
python manage.py migrate appName
python manage.py shell
from user.models import Student
stu = Student(name='xxxx', sex='f', ....)
stu.save()
# 返回一个模型管理器
manage = Student.objects
stu = manage.create(name=xxxx, sex="", ...)
============================================
stu = Student.objects.create(...)
stu = Student(id=1, name="xxx", sex="f")
stu.save()
===============================================================
stu = Student.objects.get(pk=1)
stu.name = 'xxx'
stu.sex = 'f'
stu.save()
PS: save方法可以实现数据的新增和修改、如果 主键不存在 或者 主键存在,但数据库中找不到对应的记录,则 新增, 否则 修改
save 方法在做数据修改的时候,采用的是 表中全字段修改
queryset = Student.objects.filter(pk=1)
queryset.update(name='xxx', sex='xxx')
Student.objects.get(pk=1).delete()
Student.objects.filter(pk=1).delete()
Student.objects.get() : 如果表中查过一条、则抛出 MultipleObjectsReturned
如果表中没有数据、则抛出DoesNotExist
Student.objects.filter(pk=1)
--
select * from t_student where id = 1
Student.objects.exclude(pk=1)
-- 相当于 mysql
select * from t_student where id != 1
Student.objects.all()
Student.objects.values("id", "name")
-
即可-- 按照 name 升序排列
Student.objects.order_by("name")
-- 按照 name 降序排列
Student.objects.order_by("-name")
Student.objects.values("sex").distinct()
# 查询成绩大于 50分 的学生
select * from t_student where score > 50 ;
Student.objects.filter(score__gt=50)
# 查询成绩 大于 50 且 性别为 男的所有学生
select * from t_student where score > 50 and sex = 'm'
Student.objects.filter(score__gt=50, sex='m')
-- 使用 Q 查询、完成 and 逻辑与
from django.db.models import Q
Student.objects.filter(Q(score__gt=50) & Q(sex='m') )
# 查询 成绩大于 50 或者 性别为 男 的学生
select * from t_student where score > 50 or sex = 'm'
Student.objects.filter( Q(score__gt=50) | Q(sex__exact='m') )
__startswith= 以 … 开头
__endswith= 以 … 结尾
__contains= 包含…
__istartswith= 以 … 开头,忽略大小写
__iendswith= 以 … 结尾,忽略大小写
__icontains= 包含…,忽略大小写
# 查询 名字包含 a 的所有学生
select * from t_student where name like '%a%'
Student.objects.filter(name__contains="a")
# 查询 成绩在 60 -80 之间的所有学生
select * from t_student where score between 60 and 80 ;
Student.objects.filter(score__range=(60, 80))
查询 id 为 1,3 ,5 的所有学生
select * from t_student where id in (1, 3, 5)
Student.objects.filter(pk__in=(1,3,5))
查询 生日 为空的学生信息
select * from t_student where birthday is null ;
Student.objects.filter(birth__isnull=True)
Student.objects.filter(create_time__date="2020-09-10")
-- 将ID=1 的学生成绩增加 40 分
Student.objects.filter(pk=1).update(score= F("score") + 40)
-- 按照成绩升序排列、没有成绩的显示在末尾
Student.objects.order_by(F("score").asc(nulls_last=True))
F 对象中,有 asc 和 desc 两个方法实现 基于某个属性的排序
asc , desc 两个函数都可以 设置两个属性
nulls_last : 空值是否显示在最后
nulls_first: 空值是否现在在前面
from django.db.models import Sum. Avg, Max, Min , Count
-- 查询男生、女生对应的人数
Student.objects.values("sex").annotate(count=Count("sex"))
-- 查询学生中成绩最高的分数
Student.objects.aggregate(max=Max("score"))
from django.db.models import Func
Student.objects.values("name", md5=Func(F("name"), function="md5"))
---
select name, md5(name) as md5 from t_student
from django.db.models import Value
Student.objects.create(name=Func(Value("abc"), function="md5"), sex="m")
Student.objects.values(namex = Func(F("name"), 1 , 2 , function="substring"))
from django.contrib.auth.models import User
class StudentManage(models.Manage):
def create_stu(**kwargs):
model = self.model(**kwargs)
model.save()
return model ;
class Student(models.Model):
...
objects = StudentManage()
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
python manage.py inspectdb 表