Django的ORM操作4

一、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')

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

theskylife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值