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

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常用模块汇总

      目录 django常用模块汇总 django常用模块汇总 from django.conf import settings # Django配置文件,自己django项目有配置就用自己的,没有就用系统默认配置。 from django import forms # form组件 class MyForm(forms.Form) from django.f…

    Django 2023年4月11日
    00
  • Django结合Websocket进行WebSSH的实现

    什么是webssh?   泛指一种技术可以在网页上实现一个 终端。从而无需 之类的模拟终端工具进行 连接,将 这一比较低层的操作也从 架构扭成了 架构 这样的架构常用在运维制作开发一些堡垒机等系统中,或是目前比较新型的在线教育方式,通过向学生提供一个可以直接使用浏览器进行相关 操作或代码编写的学习方式 主要是建立客户端与服务端的即时通信 模型 此种 实现方式…

    Django 2023年4月13日
    00
  • django美化后台django-suit的安装配置操作

    下面我将为您详细讲解如何使用django-suit美化django后台管理界面: 安装django-suit 安装django-suit pip install django-suit 将django-suit添加到INSTALLED_APPS中: python INSTALLED_APPS = [ # … ‘suit’, # … ] 在settin…

    Django 2023年5月16日
    00
  • django set_signed_cookie 方法理解

    djang set_signed_cookie 理解 signed_cookie 只是加了签名的 cookie, 而不是被加密的 cookie.   signed_cookie 的作用是防止用户私自纂改.参考: Securing Web Cookies With Signatures So once I’ve logged in, we set a user…

    2023年4月10日
    00
  • Django:(01) 关于什么是Django?

      一、从 WSGI 开始了解 Django   在了解 Django 之前有必要先了解一下 Python 被用于 Web 开发的基础协议——WSGI。   在开发 web 应用时,我们不希望接触到TCP连接、HTTP原始请求和响应格式等一系列麻烦的事情,我们只想专心用 Python 编写 Web 业务,我们该怎么做?   我们需要把这些底层的麻烦事封装成一…

    Django 2023年4月11日
    00
  • PyCharm创建Django项目的简单步骤记录

    下面是详细讲解“PyCharm创建Django项目的简单步骤记录”的完整攻略。 1.环境准备 在开始创建Django项目之前,需要准备好以下环境: Python环境,可以到https://www.python.org/downloads/下载Python的安装包进行安装。 PyCharm IDE,可以到https://www.jetbrains.com/py…

    Django 2023年5月16日
    00
  • Anaconda+django安装问题

    Anaconda使用中常遇到如下问题: 如果Anaconda不是最新版本,可在Anaconda Prompt中使用如下命令更新至最新版  conda update -n base -c defaults conda  创建环境,在环境名称(这里是my_env)后加上python版本,可避免后面再安装django时出现condahttperror。  cond…

    Django 2023年4月11日
    00
  • pycharm断点调试django

    1、打开你的工程,在菜单栏里找到Run–>Edit Configurations 2、在打开的对话框里边选择Python,点击”+”号 3.选择python 4、出现了一个新的项Unnamed,你可以把它改名叫debug,好听一点 5、脚本选择你网站的manage.py,脚本参数用runserver,跟你平常用命令行是一样的,聪明的同学应该已经发现了…

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