Django中ORM基本应用与原理解析

yizhihongxing

Django中ORM基本应用与原理解析

什么是ORM

ORM(Object-relational mapping),即对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换(ORM技术对应的是关系型数据库)。简单来说,ORM就是一种通过操作对象而非数据库表来操作数据库的技术。

Django的ORM是关系型数据库操作的一个工具,它将Python类与数据库中的表建立映射关系,并提供了大量的方法来对数据库进行操作。

Django ORM的基本应用

连接数据库

在使用Django ORM之前,首先需要在settings.py文件中配置连接数据库的信息。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'NAME': 'database_name', # 数据库名称
        'USER': 'username', # 数据库用户名
        'PASSWORD': 'password', # 数据库密码
        'HOST': '127.0.0.1', # 数据库主机
        'PORT': '3306', # 数据库端口号
    }
}

以上配置了连接mysql数据库的信息,其他数据库引擎的配置方式也类似。

创建模型类

在Django中,每个模型类对应着一个数据库表,通过定义模型类中的字段和方法,我们可以对数据库进行增删改查操作。

假设有一个“用户”表,包含id、name、age三个字段,则可以通过以下方式定义模型类User:

from django.db import models

class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    age = models.IntegerField()

其中,models.Model是一个基类,代表了一个表格,而id、name、age等字段则是该表格中的字段。

数据库操作

插入数据

通过创建模型类之后,可以使用模型类的对象来操作数据表。

user = User(name='张三', age=18)
user.save()

以上代码创建了一个User对象,并插入数据库。

也可以通过create()方法直接创建一个对象并插入数据库:

User.objects.create(name='李四', age=20)

查询数据

查询数据可以使用filter()方法,示例:

users = User.objects.filter(name__contains='张')

以上代码查询了所有name中包含“张”的用户。

另外,还有get()方法可以查询单条数据,示例:

user = User.objects.get(id=1)

以上代码查询了id为1的用户。

更新数据

更新数据可以使用save()方法,示例:

user = User.objects.get(id=1)
user.name = '新名字'
user.save()

以上代码将id为1的用户的name字段更新为“新名字”。

删除数据

删除数据可以使用delete()方法,示例:

user = User.objects.get(id=1)
user.delete()

以上代码删除了id为1的用户。

Django ORM的原理解析

在Django ORM的使用过程中,我们其实是在使用Django封装好的数据库访问API进行操作的,而这些API调用的是Django中的核心代码。

一般来说,在Django应用中,模型都继承自django.db.models.Model类,而Model类提供了很多数据库操作方法,比如save()、delete()等。

当我们调用save()方法时,Django会使用该模型对象的定义类中的一些元信息来生成一条SQL语句,比如INSERT语句。

Django中的ORM是基于Python的元类来实现的。元类是Python中非常重要的概念之一,它允许程序员在运行时创建类,并提供了很多高级语言特性。

Django中的Model类就是通过元类来创建的。

class ModelBase(type):
    def __new__(cls, name, bases, attrs):
        # 如果是模型类则添加一些方法,比如save()、delete()等
        if name == 'Model':
            return super(ModelBase, cls).__new__(cls, name, bases, attrs)
        fields = {}
        for key, value in attrs.items():
            if isinstance(value, Field):
                fields[key] = value
        attrs_meta = attrs.get('Meta', None)
        _meta = Options(attrs_meta, app_label=None)
        attrs['_meta'] = _meta
        attrs['fields'] = fields
        new_cls = super(ModelBase, cls).__new__(cls, name, bases, attrs)
        registry.register(new_cls)
        return new_cls


class Model(metaclass=ModelBase):
    def __init__(self, *args, **kwargs):
        pass

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        pass

    def delete(self, using=None, keep_parents=False):
        pass

以上是Django的一部分源码,其中ModelBase是继承自type的元类,用于创建Model类,而Model类是通过ModelBase来创建的。

示例说明

示例1:微博系统模型类定义与数据库操作

模型类的定义:

from django.db import models

class User(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    age = models.IntegerField()

class Weibo(models.Model):
    id = models.AutoField(primary_key=True)
    content = models.TextField()
    create_time = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

以上代码定义了两个模型类User和Weibo,其中Weibo类通过ForeignKey关联了User类。

插入微博数据:

user = User(name='张三', age=18)
user.save()

weibo = Weibo(content='今天天气真好', author=user)
weibo.save()

以上代码插入了一条微博数据,其中微博作者是id为1的用户。

查询某个用户发布的所有微博:

user = User.objects.get(id=1)
weibos = user.weibo_set.all()

以上代码查询id为1的用户发布的所有微博。

示例2:博客系统模型类定义与数据库操作

模型类的定义:

from django.db import models

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30)
    email = models.EmailField()

class Blog(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=200)
    content = models.TextField()
    pub_time = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

以上代码定义了两个模型类Author和Blog,其中Blog类通过ForeignKey关联了Author类。

插入博客数据:

author = Author(name='张三', email='xxx@qq.com')
author.save()

blog = Blog(title='测试博客', content='这是一篇测试博客。', author=author)
blog.save()

以上代码插入了一篇博客,其中博客作者是id为1的用户。

查询某个作者发布的所有博客:

author = Author.objects.get(id=1)
blogs = author.blog_set.all()

以上代码查询id为1的作者发布的所有博客。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django中ORM基本应用与原理解析 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析

    目录 序列化类常用字段类和字段参数 常用字段类 常用字段参数 选项参数 通用参数 序列化类高级用法之source source填写类中字段 source填写模型类中方法 source支持跨表查询 定制序列化字段的两种方式 准备工作 方法一:使用SerializerMethodField 方法二:在模型类中写方法 关系表外键字段的反序列化保存 前端提交的数据 …

    Django 2023年4月13日
    00
  • Django配置Mysql数据库连接的实现

    确保Django项目在本地开发环境中正确地连接到Mysql数据库是至关重要的。下面是连接Django项目到Mysql数据库的完整攻略。 安装mysqlclient包 Mysqlclient是Python和MySQL之间的一个轻量级驱动程序。通过使用它,Django可以连接到Mysql数据库并进行几乎所有的数据库操作。 在安装mysqlclient之前,需要确…

    Django 2023年5月16日
    00
  • Django分页和查询参数的问题

    查询是通过get的方式,之前没有分页之前,url是这样的: http://hostname/search?query=port%3A8080 那么我的想法是如果分页了。 1,不带page参数了。next之后就加载下一页的内容 http://hostname/search?query=port%3A8080 请问这个是通过post传参吗? 2,使用官方文档中的…

    Django 2023年4月12日
    00
  • django框架学习:十八.添加创建时间DateTimeFiled

    admin后台发布文章时,一般会有创建时间和最后更新时间这2个字段,创建时间是第一次创建时添加的,最后更新时间是每次更新内容时间更新。 在models.py文件创建表时,设置create_time 和update_time 类型为DateTimeFiled,添加auto_now_add和auto_now参数。 DateTimeField 创建django的m…

    2023年4月10日
    00
  • django前后端交互

    前后端交互的方式有两种,一种是自己写个html页面,插入数据,一种是使用django自带的后台管理,插入数据 下面介绍方式1: post.html <!DOCTYPE html> <html lang=”en”> <head> <meta charset=”UTF-8″> <title>Title&…

    Django 2023年4月13日
    00
  • vue前端与django后端数据交互

    //把数据传到路径为/airCdt/的django后端函数进行数据处理 onSubmit(){ const dict={ ‘floor’: this.formLabelAlign.floor, ‘room’: this.formLabelAlign.room, ‘status’: this.formLabelAlign.status, ‘mode’: thi…

    Django 2023年4月12日
    00
  • django之cookie、session和ajax

       cookie是什么?          保存在客户端浏览器上的键值对   {k:v}          cookie依附在请求头或响应头中出现          发送请求时,会自动携带自己网站的cookie    应用:          实现登录          投票 1.1 获取Cookie request.COOKIES[‘key’] requ…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部