一、orm基本操作
1.初步使用
在app文件路径下,找到models.py,写入需要创建的数据模型:
from django.db import models
# Create your models here.
class UserInfo(models.Model):
#id列,自增,主键
#用户名列,字符串类型,指定长度
username=models.CharField(max_length=32)
name=models.CharField(max_length=32)
password=models.CharField(max_length=64)
age=models.IntegerField(max_length=64)
并在project的settings文件路径下,添加app名称:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
]
2.Django的数据类型
官方文档地址:https://mp.csdn.net/postedit/90401036
2.1 Django中的数据类型的基类都是models.py中的Field类,下面是一些常用的数据类型:
AutoFielld
class AutoField(Field):
AutoFielld:自动增长的integerField,通常不需要指定,Django会自动创建
BigAutoField
class BigAutoField(AutoField):
64位整数,
值的范围是 -9223372036854775808 到9223372036854775807 之间, 这个字段默认的表单组件是一个 TextInput
BooleanField
class BooleanField(Field):
布尔字段,True/False,
此字段的默认表单挂件是一个 CheckboxInput,如果你需要设置 null 值,则使用 NullBooleanField 来代替 BooleanField。
如果Field.default没有指定的话, BooleanField 的默认值是 None。
CharField
class CharField(Field):
字符串,该字段默认的表单样式是TextInput,
CharField必须接收一个额外的参数:max_length,在数据库层和Django表单验证中限制字段长度。
如果字符串大的话,可以用TextField。
CommaSeparatedIntegerField
class CommaSeparatedIntegerField(CharField):
逗号分隔的整数字段。同样需要指定max_lengh参数,数据库移植时需要注意
DateField
class DateField(DateTimeCheckMixin, Field):
日期字段。
auto_now(True/False),当对象保存时,自动将该字段的值设为当前时间,通常用于表示'last-modified'时间戳。
auto_now_add(True/False),当对象首次被创建时,自动将该字段的值设置为当前时间,通常用于表示对象创建时间。
DateTimeField
class DateTimeField(DateField):
日期时间字段,
auto_now,auto_now_add方法同DateField
DecimalField
class DecimalField(Field):
十进制浮点数,
max_digits,表示总数
decimal_places,表示小数位数
DurationField
class DurationField(Field):
用作存储一段时间的字段类型 - 类似Python中的timedelta. 当数据库使用的是PostgreSQL, 该数据类型使用的是一个 interval
而在Oracle上,则使用的是 INTERVAL DAY(9) TO SECOND(6). Otherwise a bigint of microseconds is used.
DurationField 的算数运算在多数情况下可以很好的工作。 然而,在除了PostgreSQL之外的其他数据库中, 将 DurationField 与 DateTimeField 的实例比较则不会得到正确的结果。
EmailField
class EmailField(CharField):
带有检查Email合法性的CharField,
使用EmailValidator来验证输入合法性,
max_length从75增加到254以符合RFC3696/5321标准。
FilepathField
class FilePathField(Field):
# 一个 CharField ,内容只限于文件系统内特定目录下的文件名
# 参数, 其中第一个是必需的:
# path 必填。这个 FilePathField 应该得到其选择的目录的绝对文件系统路径。例如: "/home/images"
# match 可选,match 只匹配基本文件名(base filename), 而不是整个文件路径(full path)
# recursive 可选,True/False,默认 False
# allow_files 可选,True/False,默认 False
# allow_folders 可选,True/False,默认 False
FloatField
class FloatField(Field):
浮点数,
max_digits 总位数(不包括小数点和负号)
decimal_places 小数位数
举例, 要保存最大值为 999 (小数点后保存2位),你要这样定义字段:
models.FloatField(..., max_digits=5, decimal_places=2)
ImageField
classImageField(upload_to = None,height_field = None,width_field = None,max_length = 100,**选项)[source]
从中继承所有属性和方法FileField,但也验证上载的对象是有效图像。
除了可用于特殊属性FileField,一个ImageField也具有height和width属性。
为了便于查询这些属性,ImageField有两个额外的可选参数:
ImageField.height_field¶
每次保存模型实例时,将使用图像高度自动填充的模型字段的名称。
ImageField.width_field¶
每次保存模型实例时,将使用图像宽度自动填充的模型字段的名称。
ImageField实例在数据库中创建为varchar 默认最大长度为100个字符的列。与其他字段一样,您可以使用max_length参数更改最大长度。
此字段的默认表单窗口小部件是 ClearableFileInput。
IntegerField
class IntegerField(Field):
整数,
从 -2147483648 到 2147483647 范围内的值是合法的。默认的表单输入工具是TextInput.
BigIntegerField
class BigIntegerField(IntegerField):
一个64位整数,
值的范围是 -9223372036854775808 到9223372036854775807之间.
这个字段默认的表单组件是一个TextInput.
IPAddressField
class IPAddressField(Field)
该字段已废弃,从1.7开始支持GenericIPAddressField.
IP地址,会自动格式化(例如:“192.0.2.30”)。默认表单控件为 TextInput.
GenericIPAddressField
class GenericIPAddressField(Field):
一个 IPv4 或 IPv6 地址, 字符串格式 (例如 192.0.2.30 或 2a02:42fe::4). 这个字段的默认表单小部件是一个TextInput.
IPv6 地址会根据 RFC 4291 章节 2.2所规范, 包括该章节中第三段的的IPv4格式建议, 就像 ::ffff:192.0.2.0这样. 例如, 2001:0::0:01 将会被规范成 2001::1, ::ffff:0a0a:0a0a 被规范成 ::ffff:10.10.10.10. 所有字符都会被转换成小写.
GenericIPAddressField.protocol
限制有效输入的协议类型. 允许的值是 'both' (默认值), 'IPv4' 或 'IPv6'. 匹配不区分大小写.
NullBooleanField
class NullBooleanField(BooleanField):
像BooleanField一样,但允许NULL作为选项之一。
使用此而不是BooleanField,其中null = True。
此字段的默认表单窗口小部件是NullBooleanSelect。
PositiveIntegerField
class PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField):
类似 IntegerField, 但值必须是正数或者零(0)
PositiveSmallIntegerField
class PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField):
该模型字段类似 PositiveIntegerField, 但是只允许小于某一特定值(依据数据库类型而定)。
从0 到 32767 这个区间,对于Django所支持的所有数据库而言都是安全的。
SlugField
class SlugField(CharField):
Slug 是一个新闻术语(通常叫做短标题)。
一个slug只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在URL里的。
SmallIntegerField
class SmallIntegerField(IntegerField):
与 IntegerField这个字段类型很类似,不同的是SmallInteger类型只能在一个确定的范围内(数据库依赖)。
对于django来讲,该字段值在 -32768 至 32767这个范围内对所有可支持的数据库都是安全的。
TextField
class TextField(Field):
大文本字段。该模型默认的表单组件是Textarea。
Django1.7开始:
如果你在这个字段类型中使用了max_length属性,它将会在渲染页面表单元素Textarea 时候体现出来。但是并不会在model或者数据库级别强制性的限定字段长度。Use a CharField for that。
TimeField
class TimeField(DateTimeCheckMixin, Field):
时间字段,和Python中 datetime.time 一样
表单默认为 TextInput输入框
URLField
class URLField(CharField):
一个CharField 类型的URL,
此字段的默认表单窗口小部件是TextInput。
与所有CharField子类一样,URLField采用可选的max_length参数。 如果未指定max_length,则使用默认值200。
BinaryField
classBinaryField(max_length = None,** options)
用于存储原始二进制数据的字段。它可以分配bytes, bytearray或memoryview。
默认情况下,BinaryField设置editable为False(2.1以后支持),在这种情况下,它不能包含在ModelForm中。
BinaryField 有一个额外的可选参数:
BinaryField.max_length
字段的最大长度(以字符为单位)。在Django的验证中强制使用最大长度 MaxLengthValidator。
UUIDField
class UUIDField([**options])
一个用来存储UUID的字段。使用Python的UUID类。 当使用PostgreSQL数据库时,该字段类型对应的数据库中的数据类型是uuid,使用其他数据库时,数据库对应的是char(32)类型。
使用UUID类型相对于使用具有primary_key参数的AutoField类型是一个更好的解决方案。 数据库不会自动生成UUID,所以推荐使用default参数:
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields
请注意,可调用(省略括号)将传递给default
,而不是实例UUID
。
3.选项
通过选项实现对字段的约束,选项如下:
- null:如果为True,表示允许为空,默认值是False。
- default:默认值。
- primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
- db_column:字段的名称,如果未指定,则使用属性的名称。
- db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。
- unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。
- unique_for_date 日期唯一
- unique_for_month 月份唯一
- unique_for_year 年唯一
- auto_now 创建时,自动生成时间
- auto_now_add 更新时,自动更新为当前时间
#每次修改时间,自动更新最后时间的值
obj=models.UserInfo.objects.filter(id=uid).first()
obj.username="AAA"
obj.save()
- choices django admin中显示下拉框
user_type_choice=(
(1,"超级用户"),
(2,"管理用户"),
(3,"普通用户"),
)
#integerField类型,choice填存储的元组,default表示默认为1(超级用户),
user_type_id=models.IntegerField(choice=user_type_choice,default=1)
- blank: django admin 如果为True,则该字段在admin允许为空白,默认值是False。
- 对比:null是数据库范畴的概念,blank是表单验证证范畴的。
- verbose_name django admin 显示字段中文
- editable django admin是否可以被编辑
- error_messages django admin 错误信息
- help_text django admin 提示
- validators django admin 自定义错误
4.关系:
1 一对多关系
models.ForignKey() 外键约束
定义在多类中
用法举例:
在表中创建一个外键:
#models.py中为UserInfo创建一个外键,另外一个类名称是UserGroup
user_group=models.ForeignKey('UserGroup',to_field='uid',on_delete="CASCADE")
#参数说明:
#on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
#CASCADE:此值设置,是级联删除。
#PROTECT:此值设置,是会报完整性错误。
#SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
#SET_DEFAULT:此值设置,会把设置为外键的默认值。
#SET():此值设置,会调用外面的值,可以是一个函数。
调用:
#创建一条记录,注意此处是user_group_id,而不是user_group对象
models.UserInfo.objects.create(
username=u,
password=p,
age=age,
name=name,
user_group_id=2
)
user_list=models.UserInfo.objects.all()
for row in user_list:
print(row.id)
print(row.user_group.caption) #可以获取到相对应组中的信息
反调用:
UserInfo_set
2 多对多关系
models.ManyToManyField()
定义在哪一个都行
3 一对一关系
models.OnetoOneField()
定义在哪一个类都可以
5.增删改查
下面对UserInfo表进行修改:
5.1 增
关键函数:create,save
#方法1:
models.UserInfo.objects.create(
username='a',
name='aa',
age=26
)
#方法2:
dict={'username':'e','name':'ee','age':22}
models.UserInfo.objects.create(**dict)
#方法3:
obj=models.UserInfo(
username='b',
name='bb',
password=123,
age=25
)
obj.save()
5.2 删
关键函数:delete()
result = models.UserInfo.objects.filter(age__gt=23).exclude(password='123456').delete()
#exclude()表示不等于 __gt表示 >
5.3 改
关键函数:update
models.UserInfo.objects.all().update(password='1234567')
models.UserInfo.objects.filter(name="ccc").update(username="f",name="ff",age=21)
5.4 查
#查全部数据
result=models.UserInfo.objects.all()
#查年龄大于23岁的并且密码为123456
result = models.UserInfo.objects.filter(age__gt=23,password='123456')
# __gt(>) __gte(>=) __lt(<) __lte(<=)
6.取数据的几种类型
6.1 对象
#类似这种形式,queryset获取到的都是对象。
models.User.objects.filter(id__gte=10)
#models.USerInfo.objects.get(id=1) 没有会报错
models.UserInfo.objects.filter(id=1).first()
6.2 字典
#QuerySet,内部元素为字典
models.UserInfo.objects.all().values('id','username','password')
6.3 元组
#Queryset,获取的是元组
models.UserInfo.objects.all().values_list('id','username')