Django模型类之models字段类型和参数以及元数据meta

models之字段类型和参数

示例:

# class Test(models.Model):  # courses_test
#     """测试学习用"""
#     # Auto = models.AutoField()  # 自增长字段
#     # BigAuto = models.BigAutoField()
#
#     # 二进制数据
#     Binary = models.BinaryField()
#
#     # 布尔型
#     Boolean = models.BooleanField()
#     NullBoolean = models.NullBooleanField()
#
#     # 整型
#     PositiveSmallInteger = models.PositiveSmallIntegerField(db_column="age")  # 5个字节
#     SmallInteger = models.SmallIntegerField(primary_key=False)  # 6个字节
#     PositiveInteger = models.PositiveIntegerField()  # 10个字节
#     Integer = models.IntegerField(verbose_name="11个字节大小")  # 11个字节
#     BigInteger = models.BigIntegerField(unique=True)  # 20个字节
#
#     # 字符串类型
#     Char = models.CharField(max_length=100, null=True, blank=True, db_index=True)  # varchar
#     Text = models.TextField(help_text="这个是longtext")  # longtext
#
#     # 时间日期类型
#     Date = models.DateField(unique_for_date=True, auto_now=True)  #自动填入最新时间
#     DateTime = models.DateTimeField(editable=False, unique_for_month=True, auto_now_add=True)
#     Duration = models.DurationField()  # int, Python timedelta实现
#
#     # 浮点型
#     Float = models.FloatField()
#     Decimal = models.DecimalField(max_digits=4, decimal_places=2)  # 11.22, 16.34
#
#     # 其它字段
#     Email = models.EmailField()  # 邮箱
#     Image = models.ImageField()
#     File = models.FileField()
#     FilePath = models.FilePathField()
#     URL = models.URLField()
#     UUID = models.UUIDField()
#     GenericIPAddress = models.GenericIPAddressField()
#
#
# class A(models.Model):
#     onetoone = models.OneToOneField(Test, related_name="one")
#
#
# on_delete 六种模式
# class B(models.Model):
#     foreign = models.ForeignKey(A, on_delete=models.CASCADE)  # 删除级联
#     # foreign = models.ForeignKey(A, on_delete=models.PROTECT)
#     # foreign = models.ForeignKey(A, on_delete=models.SET_NULL, null=True, blank=True)  # 删除置空
#     # foreign = models.ForeignKey(A, on_delete=models.SET_DEFAULT, default=0)
#     # foreign = models.ForeignKey(A, on_delete=models.DO_NOTHING)
#     # foreign = models.ForeignKey(A, on_delete=models.SET)
#
#
# class C(models.Model):
#     manytomany = models.ManyToManyField(B)

# 1.所有字段都有的参数
# 2.个别字段才有的参数
# 3.关系型字段的参数

"""
on_delete 当一个被外键关联的对象被删除时,Django将模仿on_delete参数定义的SQL约束执行相应操作
    如下6种操作
    CASCADE:模拟SQL语言中的ON DELETE CASCADE约束,将定义有外键的模型对象同时删除!(该操作为当前Django版本的默认操作!)
    PROTECT:阻止上面的删除操作,但是弹出ProtectedError异常
    SET_NULL:将外键字段设为null,只有当字段设置了null=True时,方可使用该值。
    SET_DEFAULT:将外键字段设为默认值。只有当字段设置了default参数时,方可使用。
    DO_NOTHING:什么也不做。
    SET():设置为一个传递给SET()的值或者一个回调函数的返回值。注意大小写。
"""

实际创建表单示例:

from django.db import models

# Create your models here.

class AddressInfo(models.Model):  # coures_addressinfo
    """省市县地址信息"""
    address = models.CharField(max_length=200, null=True, blank=True, verbose_name="地址")
    pid = models.ForeignKey(‘self‘, null=True, blank=True, verbose_name="自关联",on_delete=models.SET_NULL)
    # pid = models.ForeignKey(‘AddressInfo‘, null=True, blank=True, verbose_name="自关联")
    note = models.CharField(max_length=200, null=True, blank=True, verbose_name="说明")

    def __str__(self):  # __unicode__(self)
        return self.address

    class Meta:
        # 定义元数据
        db_table = ‘address‘
        # ordering = [‘pid‘]  # 指定按照什么字段排序
        verbose_name = ‘省市县地址信息‘
        verbose_name_plural = verbose_name
        # abstract = True
        # permissions = ((‘定义好的权限‘, ‘权限说明‘),)
        # managed = False
        unique_together = (‘address‘, ‘note‘)  # ((),())
        # app_label = ‘courses‘
        # db_tablespace  # 定义数据库表空间的名字

class Teacher(models.Model):
    """讲师信息表"""
    nickname = models.CharField(max_length=30, primary_key=True, db_index=True, verbose_name="昵称")
    introduction = models.TextField(default="这位同学很懒,木有签名的说~", verbose_name="简介")
    fans = models.PositiveIntegerField(default="0", verbose_name="粉丝数")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        verbose_name = "讲师信息表"
        verbose_name_plural = verbose_name

    def __str__(self):  # Python2:__unicode__
        return self.nickname

class Course(models.Model):
    """课程信息表"""
    title = models.CharField(max_length=100, primary_key=True, db_index=True, verbose_name="课程名")
    teacher = models.ForeignKey(Teacher, null=True, blank=True, on_delete=models.CASCADE,
                                verbose_name="课程讲师")  # 删除级联
    type = models.CharField(choices=((1, "实战课"), (2, "免费课"), (0, "其它")), max_length=12,
                            default=0, verbose_name="课程类型")
    price = models.PositiveSmallIntegerField(verbose_name="价格")
    volume = models.BigIntegerField(verbose_name="销量")
    online = models.DateField(verbose_name="上线时间")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        verbose_name = "课程信息表"
        get_latest_by = "created_at"
        verbose_name_plural = verbose_name

    def __str__(self):
        return f"{self.get_type_display()}-{self.title}"  # 示例:实战课-Django零基础入门到实战
        # return "{}-{}".format(self.get_type_display(), self.title)  # 示例:实战课-Django零基础入门到实战

class Student(models.Model):
    """学生信息表"""
    nickname = models.CharField(max_length=30, primary_key=True, db_index=True, verbose_name="昵称")
    course = models.ManyToManyField(Course, verbose_name="课程")
    age = models.PositiveSmallIntegerField(verbose_name="年龄")
    gender = models.CharField(choices=((1, "男"), (2, "女"), (0, "保密")), max_length=1,
                              default=0, verbose_name="性别")
    study_time = models.PositiveIntegerField(default="0", verbose_name="学习时长(h)")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        verbose_name = "学生信息表"
        ordering = [‘age‘]
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.nickname

class TeacherAssistant(models.Model):
    """助教信息表"""
    nickname = models.CharField(max_length=30, primary_key=True, db_index=True, verbose_name="昵称")
    teacher = models.OneToOneField(Teacher, null=True, blank=True, on_delete=models.SET_NULL,
                                   verbose_name="讲师")  # 删除置空
    hobby = models.CharField(max_length=100, null=True, blank=True, verbose_name="爱好")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    class Meta:
        verbose_name = "助教信息表"
        db_table = "courses_assistant"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.nickname

简单查询语句等

 # # 1.查询、检索、过滤
        # teachers = Teacher.objects.all()
        # print(teachers)
        # teacher2 = Teacher.objects.get(nickname=‘Jack‘)  # get()只能返回一条结果,多条则会报错
        # print(teacher2, type(teacher2))
        # teacher3 = Teacher.objects.filter(fans__gte=500)  # QuerySet, 可以是多条结果
        # for t in teacher3:
        #     print(f"讲师姓名{t.nickname}--粉丝数{t.fans}")
        # # 2.字段数据匹配,大小写敏感
        # teacher4 = Teacher.objects.filter(fans__in=[666, 1231])
        # print(teacher4)
        # teacher5 = Teacher.objects.filter(nickname__icontains=‘A‘)
        # print(teacher5)
        # # 3.结果切片、排序、链式查询
        # print(Teacher.objects.all()[:1])
        # teacher6 = Teacher.objects.all().order_by(‘-fans‘)
        # for t in teacher6:
        #     print(t.fans)
        # print(Teacher.objects.filter(fans__gte=500).order_by(‘nickname‘))
        # # 4.查看执行的原生SQL
        # print(str(Teacher.objects.filter(fans__gte=500).order_by(‘nickname‘).query))
        # """SELECT `courses_teacher`.`nickname`, `courses_teacher`.`introduction`, `courses_teacher`.`fans`,
        # `courses_teacher`.`created_at`, `courses_teacher`.`updated_at` FROM `courses_teacher`
        # WHERE `courses_teacher`.`fans` >= 500 ORDER BY `courses_teacher`.`nickname` ASC
        # """
        """返回新QuerySet API"""
        # 1.all(), filter(), order_by(), exclude(), reverse(), distinct()
        # s1 = Student.objects.all().exclude(nickname=‘A同学‘)
        # for s in s1:
        #     print(s.nickname, s.age)
        # s2 = Student.objects.all().exclude(nickname=‘A同学‘).reverse()
        # for s in s2:
        #     print(s.nickname, s.age)

        # 2.extra(), defer(), only() 实现字段别名,排除一些字段,选择一些字段
        # s3 = Student.objects.all().extra(select={"name": "nickname"})
        # for s in s3:
        #     print(s.name)
        # print(str(Student.objects.all().only(‘nickname‘, ‘age‘).query))

        # 3.values(), values_list() 获取字典或元组形式的QuerySet
        # print(TeacherAssistant.objects.values(‘nickname‘, ‘hobby‘))
        # print(TeacherAssistant.objects.values_list(‘nickname‘, ‘hobby‘))
        # print(TeacherAssistant.objects.values_list(‘nickname‘, flat=True))

        # 4.dates(), datetimes()  根据时间日期获取查询集
        # print(Course.objects.dates(‘created_at‘, ‘year‘, order=‘DESC‘))
        # print(Course.objects.datetimes(‘created_at‘, ‘year‘, order=‘DESC‘))

        # 5.union(), intersection(), difference() 并集、交集、差集
        # p_240 = Course.objects.filter(price__gte=240)
        # p_260 = Course.objects.filter(price__lte=260)
        # print(p_240.union(p_260))
        # print(p_240.intersection(p_260))
        # print(p_240.difference(p_260))

        # 6.select_related() 一对一、多对一查询优化, prefetch_related() 一对多、多对多查询优化;反向查询
        # courses = Course.objects.all().select_related(‘teacher‘)
        # for c in courses:
        #     print(f"{c.title}--{c.teacher.nickname}--{c.teacher.fans}")

        # students = Student.objects.filter(age__lt=30).prefetch_related(‘course‘)
        # for s in students:
        #     print(s.course.all())
        # print(Teacher.objects.get(nickname="Jack").course_set.all())

        # 7.annotate() 使用聚合计数、求和、平均数 raw() 执行原生的SQL
        # print(Course.objects.values(‘teacher‘).annotate(vol=Sum(‘volume‘)))
        # print(Course.objects.values(‘teacher‘).annotate(pri=Avg(‘price‘)))

        # """不返回Query API"""
        # # 1.获取对象 get(), get_or_create(), first(), last(), latest(), earliest(), in_bulk()
        # print(Course.objects.first())
        # print(Course.objects.last())
        # print(Course.objects.earliest())
        # print(Course.objects.latest())
        # print(Course.objects.in_bulk([‘Python系列教程4‘, ‘Golang系列教程1‘]))
        #
        # # 2.创建对象 create(), bulk_create(), update_or_create() 创建,批量创建,创建或更新
        #
        # # 3.更新对象 update(), update_or_create() 更新,更新或创建
        # Course.objects.filter(title=‘Java系列教程2‘).update(price=300)
        #
        # # 4.删除对象 delete() 使用filter过滤
        # Course.objects.filter(title=‘test‘).delete()
        #
        # # 5.其它操作 exists(), count(), aggregate() 判断是否存在,统计个数,聚合
        # print(Course.objects.filter(title=‘test‘).exists())
        # print(Course.objects.filter(title=‘Java系列教程2‘).exists())
        # print(Course.objects.count())
        # print(Course.objects.aggregate(Max(‘price‘), Min(‘price‘), Avg(‘price‘), Sum(‘volume‘)))
        # courses = Course.objects.values(‘teacher‘).annotate(t=GroupConcat(‘title‘, distinct=True,
        #                                                                   ordering=‘title ASC‘,
        #                                                                   separator=‘-‘))
        # for c in courses:
        #     print(c)

        # Course.objects.update(price=F(‘price‘) - 11)
        # print(Course.objects.filter(volume__lte=F(‘price‘) * 10))
        #
        # print(Course.objects.filter(Q(title__icontains=‘java‘) & Q(volume__gte=5000)))
        #
        # print(Course.objects.filter(Q(title__icontains=‘golang‘) | Q(volume__lte=1000)))

原文地址:https://www.cnblogs.com/Mixtea/p/10505143.html

时间: 2024-08-05 02:36:36

Django模型类之models字段类型和参数以及元数据meta的相关文章

django的Model 模型中常用的字段类型

常用的字段类型: AutoField:自增长字段,通常不用,如果未在Model中显示指定主键,django会默认建立一个整型的自增长主键字段 BooleanField:布尔型,值为True或False,在管理工具表现为checkbox CharField:单行字符串字段,CharField有一个必填参数:      CharField.max_length:字符的最大长度,django会根据这个参数在数据库层和校验层限制该字段所允许的最大字符数. TextField:textarea字段,即多行

7.Django模型类的定义和管理

Django的模型类是给ORM层服务的 1.每个数据模型都是django.db.models.Model的子类. 2.它的父类Model包含了所有必要的和数据库交互的方法,并提供了定义数据库字段的语法. 3.每个模型相当于一个数据库表(这条规则的例外情况是多对多关系,多对多关系的时候会多生成一张关系表), 4.每个属性是表中的一个字段.属性名就是字段名,类型就是字段类型 5.模型之间的三种关系 一对一(OneToOneField) 一对多(ForeignKey) 多对多(ManyToMangFi

Django 模型类—查询

1.修改mysql的日志文件: 让其产生mysql.log,即是mysql的日志文件,里面记录的对MySQL数据库的操作记录. (1)使用下面的命令打开mysql 的配置文件,去除68,69行的注释,然后保存.sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 打开之后输入68,然后按G (2)重启mysql服务,就会产生mysql日志文件.sudo service mysql restart (3)打开MySQL的日志文件./var/log/mysql/mys

django模型中, 外键字段使用to_filed属性 指定到所关联主表的某个字段

在django项目的开发过程中,在设计模型时一开始将主键设置成了一个自定义的字段,但是在创建搜索索引时却发现必须要存在一个id的字段,并且为主键(不知道是否是项目一开始就这样配置的原因), 但此时表结构已经整体固定下来,并且有外键关联到了这个自定义的的主键,整个后台视图逻辑也已经封装完成,如果主表的主键发生改变,那么外键所在的表就会默认关联到新的主键上,那个后台视图的改动就会非常麻烦,这时就需要使用外键字段中的to_field属性来指定所关联的主表的某个字段,而不会影响到原先的逻辑 demo如下

Django模型层(models.py)之模型创建

Django数据库操作是十分重要的内容,这两天简单学习了数据库的操作,这里做个总结. 1.ORM简介 简单的来说,ORM就是对象-关系-映射.它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库. 2.创建模型前的准备 在settings中配置databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'myorm_test', #需要连

Django中ORM模型总结(二)[模型类的对应关系,模型类的属性,字段类型]

模型类的对应关系 多对多 创建模型类----->新闻类型类 class TypeInfo(models.Model): """创建新闻模型类""" tname = models.CharField(max_length=20) 创建模型类----->新闻内容类 class NewInfo(models.Model): """闯将新闻内容类""" ntitle = models

django的models模型类的常用数据类型和选项

django框架的models模块ORM框架,能够让我们通过编写类的方式,帮助我们自动生成数据库表. 生成的数据库表名为 应用模块名称_类名 数据库表中字段名 如果我们没有在参数中指定,就是我们写的类属性名. 通过编写类属性的方式,我们可以创建数据库表. 1 首先编写类: 稍后详细 2 然后生成迁移文件: python manage.py makemigrations 3 执行迁移: python manage.py migrate 三步骤,django会帮助我们生成相应的sql语句创建数据库表

django定义模型类

模型类被定义在应用文件夹下的model.py中 模型类必须继承Django的models.Model类 属性名不能用连续的两条下划线__ 主键:primary key,简写 pk 不需要主动定义,django会自动生成自增长的主键,属性名叫 id, 如果开发者自己定义了主键,则django不会再生成默认的主键 格式: 属性名=models.字段类型(字段选项) 字段类型: 类型 说明 AutoField 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建名为id的自

django模型和字段

一个模型(model)就是一个单独的.确定的数据的信息源,包含了数据的字段和操作方法.通常,每个模型映射为一张数据库中的表. 基本的原则如下: 每个模型在Django中的存在形式为一个Python类 每个模型都是django.db.models.Model的子类 模型的每个字段(属性)代表数据表的某一列 Django将自动为你生成数据库访问API 简单示例: 下面的模型定义了一个“人”,它具有first_name和last_name字段: from django.db import models