django之models学习总结

from django.db import models

# Create your models here.
class Classes(models.Model):
    '''
    班级表
    '''
    title=models.CharField(max_length=32)
    m=models.ManyToManyField('Teachers')

'''
obj=models.Classes.objects.filter(id=1).first()
obj.m.add(1)  代表创建班级id=1 老师Id=1数据对象
obj.m.add(2)  代表创建班级id=1 老师Id=2数据对象
 
obj=models.Classes.objects.filter(id=2).first()
obj.m.add(1)  代表创建班级id=2 老师Id=1数据对象
obj.m.add(2)  代表创建班级id=2 老师Id=2数据对象
obj.m.add([2,3])  代表创建班级id=2 老师id=2 id=3数据对象

'''
class Teachers(models.Model):
    '''
    老师表
    '''
    '''-----------单表-----------------
    每个数据对象在数据库中会有一列自增的ID
    一、创建数据对象(增)
    创建数据对象的两种方法
    1.models.Teachers.objects.create(name='xx')
    
    
    2.obj=Teachers(name='xx')
      obj.save()
      
      
      二、获取数据对象(查)
      models.Teachers.objects.all() //获取所有对象
      models.Teachers.objects.filter(id=1)//获取某个对象
      models.Teachers.objects.filter(id=1,name='xx')
      models.Teachers.objects.filter(id__gt=1)//获取ID大于等于1的对象
      models.Teachers.objects.filter(id__gt=1).first()//获取ID大于等于1的对象中的第一个
      models.Teachers.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
      三、删除数据对象(删)
      models.objects.Teachers.filter(id=1).delete()//删除ID=1对象
      
      四、修改数据对象
      models.Teachers.objects.all().update(name='xx')
      models.Teachers.objects.filter(id=1).update(name='xx')//有过滤条件的修改
    '''

    name=models.CharField(max_length=32)

class Student(models.Model):
    '''
    学生表
    '''

    username=models.CharField(max_length=32)
    age=models.IntegerField()
    gender=models.BooleanField()
    cs=models.ForeignKey(Classes,on_delete=models.CASCADE) #ForeignKey约束的对象在数据库中会自带下划线__id,此处的cs 里面包含id 和title


    '''
    学生对象在数据库中右5列标识

    id     username        age      gender      cs__id
    
    
    1.创建数据对象(增)
    models.Students.objects.create(username='xx',age=20,gender='男',cs__id=1)
    models.Students.objects.create(username='xx',age=20,gender='男',cs=models.Class.objects.filter(id=1).first())
    班级:
    Id     title
    1     软件工程
    2     嵌入式班
    3     大数据班
    Students类中的cs代表是班级里的一行数据:如:1 软件工程(即:id和title),若要取班级的中ID或title中的一项,
    需要采用cs__id或cs__title
    2.查询数据(查)
    res=models.Students.objects.all() //获取的是多条数据
    for item in  res:
        print(item.id)
        print(item.username)
        print(item.age)
        print(item.gender)
        print(item.cs__id)  
        print(item.cs.id)   #for循环跨表的时候可以使用cs__id或cs.id 
        print(item.cs__title)
        print(item.cs.title)
        
    3.删除(删)
    
    models.Students.objects.filter(id=1).delete()
    models.Students.objects.filter(cs__id=1).delete()
    models.Students.objects.filter(username='xxx').delete()
    
    
    cid=input('请输入班级ID')
    models.Students.objects.filter(cs__id=cid).delete()
    ctitle=input('请输入班级名称')
    models.Students.objects.filter(cs__title=ctitle).delete()
    models.Students.objects.filter(cs.title=ctitle).delete() 
    #cs.title=ctitle不成立,for循环中可以使用cs__id或cs.id,但是此处只能使用cs__id
    
    
    4.修改数据(改) 
    
    models.Students.objects.filter(id=1).update(username='xxx')
    
    '''

#多对多
'''
班级:
Id   title
1    网络1班
2    软件1班

老师:
Id      name
1       Lee
2       Mark
3       Amie

老师--班级关系对应表(类   隐藏的多对多数据表)
id    TeacherID    ClassId
1        1            2
1        1            2
2        2            1
2        2            1

'''

'''
总结:
1.models中的一个类代表数库中的一个表,类中的一个对象代表数据表中的一行记录
2.Fk字段代表关联表中的一行数据
3.manyTomany字段,自动生成第三表,依赖关联表对第三张表进行操作。
'''
2 models字段
 1 Django models 的字段类型
 2 
 3 1、models.AutoField   ---自增列 = int(11)    如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
 4 2、models.CharField   ---字符串字段  单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField。必须 max_length 参数,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数。
 5 
 6 3、models.BooleanField   ---布尔类型=tinyint(1)   不能为空,Blank=True
 7 
 8 4、models.ComaSeparatedIntegerField   ---用逗号分割的数字=varchar   继承CharField,所以必须 max_lenght 参数,
 9 
10 5、models.DateField   ---日期类型 date   对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
11 6、models.DateTimeField   ---日期类型 datetime   同DateField的参数
12 7、models.Decimal   ---十进制小数类型 = decimal   必须指定整数位max_digits和小数位decimal_places
13 8、models.EmailField   ---字符串类型(正则表达式邮箱) =varchar   对字符串进行正则表达式   一个带有检查 Email 合法性的 CharField,不接受 maxlength 参数。
14 9、models.FloatField   ---浮点类型 = double   浮点型字段。 必须提供两个 参数, 参数描述:
15 
16   max_digits:总位数(不包括小数点和符号)
17 
18   decimal_places:小数位数。如:要保存最大值为 999 (小数点后保存2位),你要这样定义字段:models.FloatField(…,max_digits=5, decimal_places=2),要保存最大值一百万(小数点后保存10位)的话,你要这样定义:models.FloatField(…,max_digits=19, decimal_places=10)
19 
20 10、models.IntegerField   ---整形   用于保存一个整数
21 11、models.BigIntegerField   ---长整形
22   integer_field_ranges = {
23     'SmallIntegerField': (-32768, 32767),
24     'IntegerField': (-2147483648, 2147483647),
25     'BigIntegerField': (-9223372036854775808, 9223372036854775807),
26     'PositiveSmallIntegerField': (0, 32767),
27     'PositiveIntegerField': (0, 2147483647),
28   }
29 12、models.IPAddressField   ---字符串类型(ip4正则表达式)   一个字符串形式的 IP 地址, (如 “202.1241.30″)。
30 13、models.GenericIPAddressField   ---字符串类型(ip4和ip6是可选的)   参数protocol可以是:both、ipv4、ipv6   验证时,会根据设置报错
31 14、models.NullBooleanField   ---允许为空的布尔类型   类似 BooleanField, 不过允许 NULL 作为其中一个选项。 推荐使用这个字段而不要用 BooleanField 加 null=True 选项。 admin 用一个选择框     <select> (三个可选择的值: “Unknown”, “Yes” 和 “No” ) 来表示这种字段数据。
32 15、models.PositiveIntegerField   ---正Integer   类似 IntegerField, 但取值范围为非负整数(这个字段应该是允许0值的…可以理解为无符号整数)
33 16、models.PositiveSmallIntegerField   ---正smallInteger  正小整型字段,类似 PositiveIntegerField, 取值范围较小(数据库相关)SlugField“Slug” 是一个报纸术语。 slug 是某个东西的小小标记(短签), 只包  含字母,数字,下划线和连字符。它们通常用于URLs。 若你使用 Django 开发版本,你可以指定 maxlength。 若 maxlength 未指定, Django 会使用默认长度: 50,它接受一个额外的参数:  
34 
35   prepopulate_from: 来源于slug的自动预置列表
36 
37 17、models.SlugField   ---减号、下划线、字母、数字   它们通常用于URLs。
38 18、models.SmallIntegerField   ---数字   数据库中的字段有:tinyint、smallint、int、bigint.   类似 IntegerField, 不过只允许某个取值范围内的整数。(依赖数据库)
39 19、models.TextField   ---字符串=longtext ,一个容量很大的文本字段, admin 管理界面用 <textarea>多行编辑框表示该字段数据。
40 
41 20、models.TimeField   ---时间 HH:MM[:ss[.uuuuuu]]   时间字段,类似于 DateField 和 DateTimeField。
42 21、models.URLField   ---字符串,地址正则表达式   用于保存URL。若 verify_exists 参数为 True (默认), 给定的 URL 会预先检查是否存在(即URL是否被有效装入且没有返回404响应).
43 22、models.BinaryField   ---二进制
44 23、models.ImageField   ---图片   类似 FileField, 不过要校验上传对象是否是一个合法图片。它有两个可选参数:height_field 和 width_field,如果提供这两个参数,则图片将按提供的高度和宽度规格保存。   该字段要求 Python Imaging 库。
45 24、models.FilePathField   ---选择指定目录按限制规则选择文件,有三个参数可选, 其中”path”必需的,这三个参数可以同时使用, 参数描述:
46 
47   path:必需参数,一个目录的绝对文件系统路径。 FilePathField 据此得到可选项目。 Example: “/home/images”;
48 
49   match:可选参数, 一个正则表达式, 作为一个字符串, FilePathField 将使用它过滤文件名。 注意这个正则表达式只会应用到 base filename 而不是路径全名。 Example: “foo。*\。txt^”, 将匹配文件 foo23.txt 却不匹配 bar.txt 或 foo23.gif;
50   recursive:可选参数, 是否包括 path 下全部子目录,True 或 False,默认值为 False。
51 
52  
53 
54   match 仅应用于 base filename, 而不是路径全名。 如:FilePathField(path=”/home/images”, match=”foo.*”, recursive=True)…会匹配 /home/images/foo.gif 而不匹配 /home/images/foo/bar.gif
55 
56  
57 
58 25、models.FileField   ---文件上传字段。 要求一个必须有的参数: upload_to, 一个用于保存上载文件的本地文件系统路径。 这个路径必须包含 strftime formatting, 该格式将被上载文件的 date/time 替换(so that uploaded files don’t fill up the given directory)。在一个 model 中使用 FileField 或 ImageField 需要以下步骤:在你的 settings 文件中, 定义一个完整路径给 MEDIA_ROOT 以便让 Django在此处保存上传文件。 (出于性能考虑,这些文件并不保存到数据库。) 定义 MEDIA_URL 作为该目录的公共 URL。 要确保该目录对 WEB 服务器用户帐号是可写的。在你的 model 中添加 FileField 或 ImageField, 并确保定义了 upload_to 选项,以告诉 Django 使用 MEDIA_ROOT 的哪个子目录保存上传文件。你的数据库中要保存的只是文件的路径(相对于 MEDIA_ROOT)。 出于习惯你一定很想使用 Django 提供的 get_<fieldname>_url 函数。举例来说,如果你的 ImageField 叫作 mug_shot, 你就可以在模板中以 {{ object。get_mug_shot_url }} 这样的方式得到图像的绝对路径。
59 
60  
61 
62 26、models.PhoneNumberField   ---一个带有合法美国风格电话号码校验的 CharField(格式:XXX-XXX-XXXX)
63 
64 27、models.USStateField   ---美国州名缩写,由两个字母组成(天朝人民无视)。
65 
66 28、models.XMLField   ---XML字符字段,校验值是否为合法XML的 TextField,必须提供参数:
67 
68   schema_path:校验文本的 RelaxNG schema 的文件系统路径。
View Code

 


  

posted on 2018-12-01 07:28  lfylcj  阅读(247)  评论(0编辑  收藏  举报

导航