django中orm模型类多种用法

这篇具有很好参考价值的文章主要介绍了django中orm模型类多种用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

模型准确且唯一的描述了数据。它包含您储存的数据的重要字段和行为。一般来说,每一个模型都映射一张数据库表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 利用这些,Django 提供了一个自动生成访问数据库的 API;

字段类型

模型中每一个字段都应该是某个 Field 类的实例, Django 利用这些字段类来实现以下功能:

  • 字段类型用以指定数据库数据类型(如:INTEGER, VARCHAR, TEXT)。
  • 在渲染表单字段时默认使用的 HTML 视图 (如: , )。
  • 基本的有效性验证功能,用于 Django 后台和自动生成的表单。
字段 描述
AutoField 一个 IntegerField,根据可用的 ID 自动递增
BigAutoField 一个 64 位整数,与 AutoField 很相似,但保证适合 1 到 9223372036854775807 的数字
BooleanField 一个 true/false 字段。该字段的默认表单部件是 CheckboxInput,或者如果 null=True 则是 NullBooleanSelect。当 Field.default 没有定义时,BooleanField 的默认值是 None。
CharField 一个字符串字段,适用于小到大的字符串。对于大量的文本,使用 TextField CharField 有两个额外的参数:CharField.max_length(必须的。该字段的最大长度)、CharField.db_collation(可选的。该字段的数据库字符序名称)
DateField 一个日期,在 Python 中用一个 datetime.date 实例表示 可选参数auto_now(每次保存对象时,自动将该字段设置为现在)、auto_now_add(当第一次创建对象时,自动将该字段设置为现在)

详见:django官方文档–字段类型

字段选项

以下只介绍Field类中的选项,拓展类每个都有独特的选项,详细参考Django文档中每个类别的详细介绍(例如, CharField (以及它的子类)需要接收一个 max_length 参数,用以指定数据库存储 VARCHAR 数据时用的字节数。)

选型 描述
null 如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False 。
blank 如果设置为 True,该字段允许为空。默认为 False。
choices 一系列二元组,用作此字段的选项 CHOICES = [(‘FR’, ‘Freshman’),(‘SO’, ‘Sophomore’),]
default 该字段的默认值
help_text 额外的“帮助”文本,随表单控件一同显示。
primary_key 如果设置为 True ,将该字段设置为该模型的主键
unique 如果设置为 True,这个字段的值必须在整个表中保持唯一

除了 ForeignKey, ManyToManyField 和 OneToOneField,任何字段类型都接收一个可选的位置参数 verbose_name,如果未指定该参数值, Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。

关联关系

显然,关系型数据库的强大之处在于各表之间的关联关系。 Django 提供了定义三种最常见的数据库关联关系的方法:多对一,多对多,一对一。

多对一关联

class ForeignKey(to, on_delete, **options)

一个多对一的关系。需要两个位置参数:模型相关的类和 on_delete 选项。

如果需要创建一个递归关系—— 一个与自己有多对一关系的对象

使用 models.ForeignKey(‘self’,on_delete=models.CASCADE)。

如果你需要在一个尚未定义的模型上创建关系,你可以使用模型的名称,而不是模型对象本身:

例如,如果一个 Car 模型有一个制造者 Manufacturer --就是说一个 Manufacturer
制造许多辆车,但是每辆车都仅有一个制造者-- 那么使用下面的方法定义这个关系:


from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    # ...
on_delete参数设置

当一个由 ForeignKey 引用的对象被删除时,Django 将模拟 on_delete 参数所指定的 SQL 约束的行为。

  • CASCADE
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.RESTRICT)

级联删除。Django 模拟了 SQL 约束 ON DELETE CASCADE 的行为,也删除了包含 ForeignKey 的对象

Model.delete() 在相关的模型上没有被调用,但是 pre_delete 和 post_delete 信号是为所有被删除的对象发送的。

  • PROTECT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT)

通过引发 ProtectedError错误,即 django.db.IntegrityError 的子类,防止删除被引用对象。

  • RESTRICT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.RESTRICT)

这个在Django 3.1.以上版本使用

通过引发 RestrictedError错误 ( django.db.IntegrityError 的一个子类)来防止删除被引用的对象。与 PROTECT 不同的是,如果被引用的对象也引用了一个在同一操作中被删除的不同对象,但通过 CASCADE 关系,则允许删除被引用的对象。

  • SET_NULL
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET_NULL,null=True)

设置 ForeignKey 为空;只有当 null 为 True 时,才有可能。

  • SET_DEFAULT
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET_DEFAULT default=1)

将 ForeignKey 设置为默认值,必须为 ForeignKey 设置一个默认值。

  • SET()
#定义一个函数进行值得返回
def get_manufacturer()
	return 1

manufacturer = models.ForeignKey(Manufacturer, on_delete=models.SET(get_manufacturer),)

将 ForeignKey 设置为传递给 SET() 的值,如果传递了一个可调用的值,则为调用它的结果。在大多数情况下,为了避免在导入 models.py 时执行查询,传递一个可调用对象是必要的

  • DO_NOTHING
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.DO_NOTHING)

不采取任何行动。如果你的数据库后端强制执行引用完整性,这将导致一个 IntegrityError 除非你手动添加一个 SQL ON DELETE 约束条件到数据库字段。

on_delete 的可能值可以在 django.db.models 中找到。

地区的自关联实例

以下使用地区的自关联查询为实例文章来源地址https://www.toymoban.com/news/detail-796686.html


#模型创建  model.py
class District(models.Model):
    parent = models.ForeignKey(
        "self",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="child", #
        verbose_name="父级地区",
    )
    name = models.CharField(max_length=128, help_text="地区名称", verbose_name="地区名称")
    level = models.IntegerField(default=0, help_text="地区级别", verbose_name="地区级别")
    full_name = models.CharField(max_length=256, help_text="地区全名", verbose_name="地区全名")
    def __str__(self):
        return self.full_name
    class Meta:
        managed=True
        verbose_name = "地区信息"
        verbose_name_plural = verbose_name
#视图调用模型以drf框架的视图的使用APIView主
class CityCountyView(APIView):
    """
    父级下二级地区信息获取
    """
    authentication_classes = [BasicAuthentication]
    permission_classes = (AllowAny,)
    @swagger_auto_schema(operation_description='父级下二级地区信息获取', responses={200: {}})
    def get(self, request, pk):
        # 判断有没有缓存,有缓存使用缓存,没有缓存去数据库查询存入缓存一天
        sub_data = cache.get('sub_data_%s' % pk)
        if not sub_data:
            try:
                # 获取到前端传过来的父级id  查询出父级对象
                parent_obj = District.objects.get(id=pk)
                # 获取对象的所有外键关联的子级
                sub_objs = parent_obj.child.all()
                subs = []
                # 组织数据
                for sub in sub_objs:
                    subs.append({'id': sub.id, 'name': sub.name, })
                sub_data = {'id': pk, 'name': parent_obj.name, 'subs': subs}
            except Exception as e:
                print(e)
                return Response({'code': 400, 'errmsg': '查询失败'})
            cache_key_name = 'sub_data_%s' % pk
            cache.set(cache_key_name, sub_data, 3600 * 24) #
        return Response({'code': 0, 'errmsg': 'ok', 'sub_data': sub_data})

动态生成模型类


#使用函数+class来定义
def getTaskDetailModel(table_name):
    class MyCLass(models.Model):
        task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name='details', verbose_name='任务')
        user_id = models.IntegerField(verbose_name='用户ID')
        created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
        is_complet = models.BooleanField(default=False, verbose_name='是否完成')
        class Meta:
            db_table = table_name

    return MyCLass

#使用函数+type进行创建动态类
def create_task_detail_model(password_code):
    classname = f'TaskDetail_{password_code}'
    class Meta:
        db_table = classname

    return type(classname, (models.Model,), {
        'task': models.ForeignKey(Task, on_delete=models.CASCADE, related_name='details', verbose_name='任务'),
        'user_id': models.IntegerField(verbose_name='用户ID'),
        'created_time': models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
        'is_complet': models.BooleanField(default=False, verbose_name='是否完成'),
        '__str__': lambda self: f"{self.task.password_code} - {self.user_id}",
        'Meta': Meta,
        '__module__': __name__,
    })

到了这里,关于django中orm模型类多种用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django ORM:数据库操作的Python化艺术

    Django的对象关系映射器(ORM)是其核心功能之一,允许开发者使用Python代码来定义、操作和查询数据库。这篇文章将带你深入了解Django ORM的强大之处,从基本概念到高级查询技巧,提供丰富的示例帮助你掌握使用Django ORM进行有效和高效的数据库操作。 Django ORM的目的是提供一

    2024年02月04日
    浏览(49)
  • 三、python Django ORM postgresql[数据定时备份、数据恢复]

    解释:备份指定数据库,能有效在发生错误时,预防错误,进行恢复 免密 cron 日志查看: tail -f -n 200 /var/log/syslog systemd timer 解释:因为博主在自己电脑上怎么用cron都不行,故使用了这个,其效果同cron类型,但效率甚至比cron高出一点点 vim /etc/systemd/system/mytask.service vim /etc/

    2024年02月13日
    浏览(25)
  • python list列表写入txt文档的多种方法

    方法一 将列表写入txt文件中 如下代码所示 a是一段二维列表,需要把它写入一个txt文件中。 方法二 数据: u = [[\\\'mov\\\', \\\'push\\\', \\\'push\\\', \\\'call\\\', \\\'push\\\', \\\'push\\\', \\\'push\\\', \\\'call\\\'],[\\\'pop\\\', \\\'push\\\', \\\'call\\\', \\\'pop\\\', \\\'retn\\\', \\\'mov\\\', \\\'push\\\', \\\'call\\\', \\\'push\\\'],[\\\'push\\\', \\\'push\\\', \\\'call\\\', \\\'pop\\\', \\\'call\\\', \\\'pop\\\', \\\'retn\\\', \\\'mov\\\', \\\'push\\\'], [\\\'lea\\\',

    2024年02月10日
    浏览(30)
  • 【Django】Django ORM Cookbook--20230427

    英文版http://books.agiliq.com/projects/django-orm-cookbook/en/latest/ 中文版https://django-orm-cookbook-zh-cn.readthedocs.io/zh_CN/latest/query.html 相同的模型类 不同的模型类 reporter__username=‘John’ 这个和 User.objects.distinct(“first_name”).all() 不同, User.objects.distinct(“first_name”).all() 会获取遇到的不同的

    2024年02月01日
    浏览(30)
  • Django之ORM

    使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(增、删、改、查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql、oracle、Microsoft SQL Server等。 如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要

    2024年02月11日
    浏览(27)
  • 掌握Python设计模式,SQL Alchemy打破ORM与模型类的束缚

    大家好,反转软件组件之间的依赖关系之所以重要,是因为它有助于降低耦合度和提高模块化程度,进而可以提高软件的可维护性、可扩展性和可测试性。 当组件之间紧密耦合时,对一个组件的更改可能会对其他组件产生意想不到的影响,从而导致整个系统中的连锁更改效应

    2024年02月01日
    浏览(29)
  • Django系列之orm查询

    现有四张表,表和表之间有一对一、一对多、多对多的关系,具体表结构如下: 以下的这些查询,都是没有设置 related_name 参数的前提下做的查询,如果要在有 related_name 参数下查询,可以参考文章 related_name的反向查询

    2024年02月15日
    浏览(32)
  • Django、数据库----------ORM框架

    目录 1.安装第三方模块 2.ORM 1.自己创建数据库 2.django连接数据库 3.django操作表 创建表:在models.py文件中 删除表以及修改表 在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据 Django开发操作数据库更简单,内部提供了ORM框架。   ORM可以

    2024年02月09日
    浏览(44)
  • [学习笔记]全面掌握Django ORM

    参考资料:全面掌握Django ORM 学习目标:独立使用django完成orm的开发 学习内容:Django ORM所有知识点 ORM:Object-Relational Mapping Django的ORM详解 在django中,应用的文件夹下面会自动建一个models.py文件。 模型类的优势与劣势 优势:让开发人员专注于业务逻辑处理,提高开发效率。不

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包