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搭建项目实战与避坑细节详解的完整攻略。 1. 安装Django 首先,你需要在本地环境中安装Django。在命令行中运行以下代码: pip install Django 这将安装最新版本的Django。如果你想要安装特定版本的Django,可以使用以下命令: pip install Django==2.2.7 2. 创建并运行D…

    Django 2023年5月16日
    00
  • Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解

    接下来我会为你详细讲解“Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解”的完整攻略。 Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解 1. 准备工作 在开始配置和使用xadmin之前,我们需要进行一些准备工作。 1.1 安装Python 首先,我们需要安装Python。可以从官方网站(htt…

    Django 2023年5月16日
    00
  • jQuery的ajax与django传参

    Django中的代码如下: urls.py代码: from django.conf.urls import url from django.contrib import admin import AjaxTest.views urlpatterns = [ url(r’^admin/’, admin.site.urls), url(r”^index/$”,A…

    Django 2023年4月13日
    00
  • fastapi与django异步的并发对比分析

    下面我将详细讲解“FastAPI与Django异步的并发对比分析”的攻略。 简介 FastAPI和Django都是Python的Web框架,用于快速构建Web应用程序。FastAPI是一个新的框架,专注于高性能和强类型支持,具有异步能力。Django是一个成熟、完整的框架,具有广泛的社区支持和丰富的功能。本文将对比这两个框架在异步并发方面的性能表现。 环境准…

    Django 2023年5月15日
    00
  • Django与MVC

    Django是遵循MVC设计模式的一个框架:MVC(Model,View,Controller);模型,视图,控制器:如图: Django其实是一个MTV的模型:(Model,Template,VIew)模型,模板,视图  

    2023年4月9日
    00
  • Python+Django搭建自己的blog网站

    首先我们将以下面两个示例为例,详细讲解“Python+Django搭建自己的blog网站”的完整攻略。 示例1 1. 创建项目和应用 首先需要安装Django,可以通过命令行输入pip install Django来进行安装。安装完成后,我们创建一个Django项目,可以通过输入如下命令创建: django-admin startproject myblog…

    Django 2023年5月16日
    00
  • django settings.py配置文件的详细介绍

    下面是针对“django settings.py配置文件的详细介绍”的完整攻略。 什么是Django的settings.py文件? settings.py是Django应用程序中最重要的配置文件之一,它存储了应用程序的主要参数设置,例如数据库信息、口令等。在项目开始前,开发者需要首先创建该文件,直接在项目目录下创建一个名为settings.py的文件即可。 …

    Django 2023年5月16日
    00
  • 浅谈Python之Django(三)

    首先需要阐述的是,“浅谈Python之Django(三)”是一篇介绍Django框架的文章,偏重于对Django的基础概念和应用的讲解。这篇文章主要分为以下几个部分: 1. Django介绍 这部分主要是对Django框架进行简单介绍,涵盖了Django的功能特点、适用场景、优势和缺点等信息。 2. Django入门 这部分主要是讲解如何在本地环境下搭建Dj…

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