zoukankan      html  css  js  c++  java
  • django 模型

    django 里面的模型 相当于在数据库里面的表 每个模型代表一个表 每个模型为一个类  它们都继承于 django.db.models.Model 每个模型的属性就相当于数据库表里面的字段

    例如:

    from django.db import models
    
    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)

    这时候Person模型会创建下面的表

    CREATE TABLE myapp_person (
        "id" serial NOT NULL PRIMARY KEY,
        "first_name" varchar(30) NOT NULL,
        "last_name" varchar(30) NOT NULL
    );

    模型使用

    需要在setting里面设置 INSTALLED_APPS

    如下

    INSTALLED_APPS = [
        #...
        'myapp',
        #...
    ]

    下面代码展示两个有关联关系的模型,可以看出artist 是Muscian模型的外键

    from django.db import models
    
    class Musician(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
        instrument = models.CharField(max_length=100)
    
    class Album(models.Model):
        artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
        name = models.CharField(max_length=100)
        release_date = models.DateField()
        num_stars = models.IntegerField()

    常用字段

    类型说明
    AutoField 一个自动增加的整数类型字段。通常你不需要自己编写它,Django会自动帮你添加字段:id = models.AutoField(primary_key=True),这是一个自增字段,从1开始计数。如果你非要自己设置主键,那么请务必将字段设置为primary_key=True。Django在一个模型中只允许有一个自增字段,并且该字段必须为主键!
    BigAutoField (1.10新增)64位整数类型自增字段,数字范围更大,从1到9223372036854775807
    BigIntegerField 64位整数字段(看清楚,非自增),类似IntegerField ,-9223372036854775808 到9223372036854775807。在Django的模板表单里体现为一个textinput标签。
    BinaryField 二进制数据类型。使用受限,少用。
    BooleanField 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField。
    CharField 字符串类型。必须接收一个max_length参数,表示字符串长度不能超过该值。默认的表单标签是input text。最常用的filed,没有之一!
    CommaSeparatedIntegerField 逗号分隔的整数类型。必须接收一个max_length参数。常用于表示较大的金额数目,例如1,000,000元。
    DateField class DateField(auto_now=False, auto_now_add=False, **options)日期类型。一个Python中的datetime.date的实例。在HTML中表现为TextInput标签。在admin后台中,Django会帮你自动添加一个JS的日历表和一个“Today”快捷方式,以及附加的日期合法性验证。两个重要参数:(参数互斥,不能共存) auto_now:每当对象被保存时将字段设为当前日期,常用于保存最后修改时间。auto_now_add:每当对象被创建时,设为当前日期,常用于保存创建日期(注意,它是不可修改的)。设置上面两个参数就相当于给field添加了editable=Falseblank=True属性。如果想具有修改属性,请用default参数。例子:pub_time = models.DateField(auto_now_add=True),自动添加发布时间。
    DateTimeField 日期时间类型。Python的datetime.datetime的实例。与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样。
    DecimalField 固定精度的十进制小数。相当于Python的Decimal实例,必须提供两个指定的参数!参数max_digits:最大的位数,必须大于或等于小数点位数 。decimal_places:小数点位数,精度。 当localize=False时,它在HTML表现为NumberInput标签,否则是text类型。例子:储存最大不超过999,带有2位小数位精度的数,定义如下:models.DecimalField(..., max_digits=5, decimal_places=2)
    DurationField 持续时间类型。存储一定期间的时间长度。类似Python中的timedelta。在不同的数据库实现中有不同的表示方法。常用于进行时间之间的加减运算。但是小心了,这里有坑,PostgreSQL等数据库之间有兼容性问题!
    EmailField 邮箱类型,默认max_length最大长度254位。使用这个字段的好处是,可以使用DJango内置的EmailValidator进行邮箱地址合法性验证。
    FileField class FileField(upload_to=None, max_length=100, **options)上传文件类型,后面单独介绍。
    FilePathField 文件路径类型,后面单独介绍
    FloatField 浮点数类型,参考整数类型
    ImageField 图像类型,后面单独介绍。
    IntegerField 整数类型,最常用的字段之一。取值范围-2147483648到2147483647。在HTML中表现为NumberInput标签。
    GenericIPAddressField class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[source],IPV4或者IPV6地址,字符串形式,例如192.0.2.30或者2a02:42fe::4在HTML中表现为TextInput标签。参数protocol默认值为‘both’,可选‘IPv4’或者‘IPv6’,表示你的IP地址类型。
    NullBooleanField 类似布尔字段,只不过额外允许NULL作为选项之一。
    PositiveIntegerField 正整数字段,包含0,最大2147483647。
    PositiveSmallIntegerField 较小的正整数字段,从0到32767。
    SlugField slug是一个新闻行业的术语。一个slug就是一个某种东西的简短标签,包含字母、数字、下划线或者连接线,通常用于URLs中。可以设置max_length参数,默认为50。
    SmallIntegerField 小整数,包含-32768到32767。
    TextField 大量文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。只有CharField才能同时作用于两者。
    TimeField 时间字段,Python中datetime.time的实例。接收同DateField一样的参数,只作用于小时、分和秒。
    URLField 一个用于保存URL地址的字符串类型,默认最大长度200。
    UUIDField 用于保存通用唯一识别码(Universally Unique Identifier)的字段。使用Python的UUID类。在PostgreSQL数据库中保存为uuid类型,其它数据库中为char(32)。这个字段是自增主键的最佳替代品,后面有例子展示。

    常用约束

    null

    不设置时默认设置为False。设置为True时,数据库表字段中将存入NULL的记录。 null和blank组合使用,null=True,blank=True,表示该字段可以为空

    blank

    默认设置为False。设置为True时,表字段许可无任何输入。设置为False 时,表字段为必须输入的字段

    choices

    备选设置。选择列表选项,如果设置后,该字段的表单必然会是下拉选择的。这个值必须是一个有小括号构成的元组,每个元组前一个字段将存入数据库,后一个字段是显示给用户看的。

    default

    默认值,设置后在用户无输入时,表字段将以这个选项的内容来存储到数据库字段

    可以为python 支持的任意数据对象

    editable

    如何设置为False,将不会参与到表单的验证。默认是设置为True的

    error_messages

    这个选项实现校验时的错误提示。是字典结构的内容。

    help_text

    在表单中形成输入提示内容

    primary_key

    主键,设置为 True ,该字段将启用为主键。 默认是 False

    unique

    设置为 True 启用不存在重复值输入的设定,默认为False

    unique_for_date

    设定日期不存在重复输入,默认为False

    verbose_name

    字段的文本标签

    validators

    校验选项,用来配置校验的方法,构成的列表。

    max_length

    最大输入字符串的长度

    min_length

    最少输入字符串的长度

    表的查询

    查询

    Person.objects.all().order_by(“-username”)   按照username字段值 反向排序

    Person.objects.all()[:10]切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负切片

    Person.objects.get(name=name)  get获取不到报异常,不可取

    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

    Person.objects.filter(name="abc")# 等于

    Person.objects.filter(name__exact="abc")名称严格等于 "abc" 的人

    Person.objects.filter(name__iexact="abc")# 名称为abc 但是不区分大小写,可以找到ABC, Abc, aBC,这些都符合条件

    ***Person.objects.filter(name__contains="abc")# 名称中包含"abc"的人

    ***Person.objects.filter(name__icontains="abc")#名称中包含"abc",且abc不区分大小写

    Person.objects.filter(name__regex="^abc")# 正则表达式查询

    Person.objects.filter(name__iregex="^abc")#正则表达式不区分大小写

    ****

    Person.objects.filter(age__gt=15)# age > 15

    Person.objects.filter(age__lt=15)# age < 15

    Person.objects.filter(age__gte=15)# age >= 15

    Person.objects.filter(age__lte=15)# age <= 15

    Person.objects.filter(age__ne=15)# age != 15

    数据的归档

     times = Person.objects.datas('add_time','month',order='desc')  默认正序,desc 倒序

     month   表示精准到月

     前端页面

    {%  for time  in times %} 

         {{ time.year }} 年 {{time.month}} 月 {{time.day}}日    精准到月,这个time.day  永远是 1

    {% endfor %}

    filter 过滤有多个条件时

    使用django的Q对象表示或者

    from django.db.models import Q

    Person.objects.filter(Q(name='张三') | Q(age=18))

    查询过滤字段

    __exact 精确等于                              like 'aaa'

     __iexact 精确等于 忽略大小写                ilike 'aaa'

     __contains 包含                              like'%aaa%'

     __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

    __gt 大于

    __gte 大于等于

    __lt 小于

    __lte 小于等于

    __in存在于一个list范围内

    *****

    __startswith以...开头

    __istartswith以...开头忽略大小写

    __endswith以...结尾

    __iendswith以...结尾,忽略大小写 

    __range 在...范围内

    __year日期字段的年份   如   .filter(add_time_year ='2018')  筛选添加时间年份为2018年的数据

    __month日期字段的月份

    __day日期字段的日

    __isnull=True/False

    本文为个人的实际操作经验之谈,转载、复制请注明出处,谢谢!
  • 相关阅读:
    SpringBoot(八):SpringBoot中配置字符编码 Springboot中文乱码处理
    SpringBoot(二): SpringBoot属性配置文件 SpringBoot多环境配置文件 SpringBoot自定义配置文件
    使用Maven新建SpringBoot工程
    SpringBoot(四): SpringBoot web开发 SpringBoot使用jsp
    SpringBoot(三):SpringBoot热部署插件
    SpringBoot(六):SpringBoot中如何使用Servlet?
    ARQ自动重传请求与UDP提供可靠交付
    多线程程序中操作的原子性转帖
    多目录的Makefile
    VC++小小绘图程序
  • 原文地址:https://www.cnblogs.com/zhouxudong/p/9553301.html
Copyright © 2011-2022 走看看