• ORM字段操作


    django orm 建表字段

     在django modle 中,我们定义的类,他的对象就是数据库表中的一行数据!!!

                   django orm 基础

    一:modle的各个字段:

    在python中以code first,所以在python中用类和对象,来调用底层数据库API来操作数据库。

    1:创建数据库:

    数据库配置写在:子应用的:modles.py配置文件中。

    需要注意的时候app需要注册。在setting中。

    默认情况下,使用的数据库是sqllite3.

    创建类:

     
     1 from django.db import models
     2 
     3 # Create your models here.
     4 class Userinfo(models.Model):
     5     '''
     6     功能:该类主要功能是创建用户的信息表格。
     7     '''
     8     user=models.CharField(max_length=12)
     9     password=models.CharField(max_length=40)
    10     ipone_num=models.CharField(max_length=12)
    11 
    12 
    13 class Hostinfo(models.Model):
    14     '''
    15     功能:该类为用户录入主机数据表格。
    16     '''
    17     host=models.CharField(max_length=32)
    18     address=models.CharField(max_length=32,default="马驹桥机房")
    19     ip=models.CharField(max_length=34)
    20     stat=models.CharField(max_length=32)
    21     prot=models.CharField(max_length=32)
    22     service=models.CharField(max_length=32,default='商城业务')
    23     department=models.CharField(max_length=32,default="应用运维")
    24     mac_info=models.CharField(max_length=32,default="00-av-tv-cctv")
    25     pingpai=models.CharField(max_length=32,default="IBM")
    26     sn=models.CharField(max_length=32,default="dad13sda")
     

    类中各个字段含义:

     
     1         1、models.AutoField  自增列 = int(11)
     2           如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
     3         2、models.CharField  字符串字段
     4           必须 max_length 参数
     5         3、models.BooleanField  布尔类型=tinyint(1)
     6           不能为空,Blank=True
     7         4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
     8             input:  12,345,989871234 9         
    10           继承CharField,所以必须 max_lenght 参数
    11         5、models.DateField  日期类型 date
    12           对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
    13         6、models.DateTimeField  日期类型 datetime
    14           同DateField的参数
    15         7、models.Decimal  十进制小数类型 = decimal
    16           必须指定整数位max_digits和小数位decimal_places
    17         8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
    18           对字符串进行正则表达式
    19         9、models.FloatField  浮点类型 = double
    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正则表达式)
    30         13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
    31           参数protocol可以是:both、ipv4、ipv6
    32           验证时,会根据设置报错
    33         14、models.NullBooleanField  允许为空的布尔类型
    34         15、models.PositiveIntegerFiel  正Integer
    35         16、models.PositiveSmallIntegerField  正smallInteger
    36         17、models.SlugField  减号、下划线、字母、数字
    37         18、models.SmallIntegerField  数字
    38           数据库中的字段有:tinyint、smallint、int、bigint
    39         19、models.TextField  字符串=longtext
    40         20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
    41         21、models.URLField  字符串,地址正则表达式
    42         22、models.BinaryField  二进制
    43         
    44         23、models.ImageField   图片    字符串
    45         24、models.FilePathField 文件   字符串
     

    需要注意的是:

    1 models.DateField  日期类型 date 对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。

    根绝自己的需要来定义这个字段和使用相应的参数。

    1 class Title(models.Model):
    2     title=models.CharField(max_length=32)
    3     add_date=models.DateField(auto_now=True)#表示该表进行数据的插入的时候时间,当前行的数据插入的时间。
    4     update_date=models.DateField(auto_now_add=True)#表示该表的该行数据进行更新的时候,记录时间。

    还有字段:models.ImageField  和、models.FilePathField在数据库中保存的是图片和文件的的路径。

    默认情况下,如果我们不指定创建 自增列(主键)的话,在数据库中,默认会给我们创建一个名为:id的自增列。

    更多参数:

     
     1 1、null=True
     2   数据库中字段是否可以为空
     3 2、blank=True
     4   django的 Admin 中添加数据时是否可允许空值
     5 3、primary_key = False
     6   主键,对AutoField设置主键后,就会代替原来的自增 id 列
     7 4、auto_now 和 auto_now_add
     8   auto_now   自动创建---无论添加或修改,都是当前操作的时间
     9   auto_now_add  自动创建---永远是创建时的时间
    10 5、choices
    11 GENDER_CHOICE = (
    12         (u'M', u'Male'),
    13         (u'F', u'Female'),
    14     )
    15 gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
    16 6、max_length
    17 7、default  默认值
    18 8、verbose_name  Admin中字段的显示名称
    19 9、name|db_column  数据库中的字段名称
    20 10、unique=True  不允许重复
    21 11、db_index = True  数据库索引
    22 12、editable=True  在Admin里是否可编辑
    23 13、error_messages=None  错误提示
    24 14、auto_created=False  自动创建
    25 15、help_text  在Admin中提示帮助信息
    26 16、validators=[]
    27 17、upload-to
    28 
    29 更多参数
     

    可以给我们的列设置默认值。default=''

    1 email = models.EmailField()            # string,帮助admin做输入验证,modelform

    创建完,类,我们进行数据库的创建:执行如下2条命令!

    1 python manage.py makemigrations
    2 python manage.py migrate

    choices:比如说性别:要么是男要么是女。如果有如下表:

     
    1 class Gender(models.Model):
    2     name=models.CharField(max_length=32)
    3 
    4 class   User_type(models.Model):
    5     user_type=models.CharField(max_length=32)
    6     nid=models.AutoField(primary_key=True)
    7     phone_num=models.IntegerField()
    8     phone_num_1=models.IntegerField()
    9     gender=models.ForeignKey('Gender')
     

    因为性别是不会改变的。如果按如上的操作,用户类型和性别表建立多对一的情况,那么在我们查询的时候,会给数据库增加压力,这时候我们可以考虑用choices。用元组来表示这个字段,用0、1来表示性别。用内存储存的元组的来

    减少表的跨表查询。

     
     1 gender_choices=(
     2     (0,''),
     3     (1,''),
     4 )
     5 
     6 class   User_type(models.Model):
     7     user_type=models.CharField(max_length=32)
     8     nid=models.AutoField(primary_key=True)
     9     phone_num=models.IntegerField()
    10     phone_num_1=models.IntegerField()
    11     gender=models.IntegerField(choices=gender_choices)#前端页面显示的是男女,而实际上数据库记录的是:0和1,减少数据库的连表操作。
     

    2:django中如果我们想修改,表结构,比如增加一个列,在之前的sqlalchemy中只能借助于第三的模块或者工具,但是在django中,不需要。只需要再执行如下命令既可修改表结构:

    1 1 python manage.py makemigrations
    2 2 python manage.py migrate

    但是在执行如下的命令的时候,需要在对应的类(表)中设置相应的default的值。否则会报错。需要注意的是:报如下错误,前提是该数据库已经插入数据!!!否则不会报错。

    解决方法:在相应的类中增加的列的中,填写默认数据:default="值",在运行命令的时候不会报错。

    1 class Title(models.Model):
    2     title=models.CharField(max_length=32)
    3     add_date=models.DateField(auto_now_add=True)#表示该表进行数据的插入的时候时间,当前行的数据插入的时间。
    4     update_date=models.DateField(auto_now=True)#表示该表的该行数据进行更新的时候,记录时间。
    5     content=models.CharField(max_length=200,default="大话西游,永恒的经典!")
    1 Hostinfo.objects.filter(id=val).values(id)
    2 Hostinfo.objects.filter(id=val).value_list(id,email)

    value:获取结果不是对象的列表的集合。内部小元素是字典,而是列表中嵌套字典。[{'id':2},{'id':1}]

    valuelist:是获取元组的集合内嵌套元组,内部小元素是元组。((2,'1@qq.com'),(1,'2@qq.com'))              

    学习是一种态度,坚持是质变的利器!
  • 相关阅读:
    element:记一次重置表单引发提交数据为默认数据现象
    三种常用又简单的排序算法
    (07)GitHub从2021.08.13开始使用Token代替账号和密码
    does not implement methodSignatureForSelector:
    自用python库
    2048
    CCSP2021游记
    2021 CCPC 桂林站游记
    2021 ICPC 沈阳站游记
    2021SDU新生赛游记
  • 原文地址:https://www.cnblogs.com/xiongmozhou/p/9093177.html
Copyright © 2020-2023  润新知