基于Django ORM、一对一、一对多、多对多的全面讲解

基于Django ORM、一对一、一对多、多对多的全面讲解

什么是Django ORM

Django是使用Python编写的一个开放源代码的Web应用程序框架,ORM(Object-Relational Mapping,对象关系映射)是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。在Django中,ORM是Django模型组件的核心。

Django通过ORM将Python程序与关系性数据库之间进行映射。使用Django ORM,可以定义模型(model)来表示应用程序中引用数据的数据结构。模型定义包含模型的字段,这些字段描述了模型的存储方式和模型的数据类型。

Django ORM 中的关系类型

一对一关系

在Django中,一对一关系是指两个模型之间只有一个匹配记录的关系。这种关系可以通过Django ORM的OneToOneField字段类型来声明。例如:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=200)

class Contact(models.Model):
    email = models.EmailField()
    address = models.CharField(max_length=200)
    person = models.OneToOneField(Person, on_delete=models.CASCADE)

在上述代码中,我们定义了两个模型:PersonContactPerson 模型只有一个字段 nameContact 模型有三个字段:emailaddresspersonperson 字段是一个 OneToOneField,指向 Person 模型,意味着一个 Contact 实例只能匹配一个 Person 实例。

一对多关系

在Django中,一对多关系是指一个模型中的一个实例可以与多个模型中的实例匹配的关系。这种关系可以通过Django ORM的ForeignKey字段类型来声明。例如:

from django.db import models

class Manufacturer(models.Model):
    name = models.CharField(max_length=200)

class Car(models.Model):
    name = models.CharField(max_length=200)
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)

在上述代码中,我们定义了两个模型:ManufacturerCarManufacturer 模型只有一个字段 nameCar 模型也只有一个字段 name,并且有一个 ForeignKey 字段 manufacturer,指向 Manufacturer 模型,意味着一个 Manufacturer 实例可以匹配多个 Car 实例。

多对多关系

在Django中,多对多关系是指两个模型之间存在多对多的关系。这种关系可以通过Django ORM的ManyToManyField字段类型来声明。例如:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)

class Author(models.Model):
    name = models.CharField(max_length=200)
    books = models.ManyToManyField(Book)

在上面的代码中,我们定义了两个模型:BookAuthorBook 模型有一个字段 titleAuthor 模型也有一个字段 name,并且有一个 ManyToManyField 字段 books 指向 Book 模型,意味着一个 Author 实例可以匹配多个 Book 实例,一个 Book 实例也可以匹配多个 Author 实例。

示例说明

一对多关系示例

下面我们使用一个示例来说明一对多关系。我们将定义两个模型:AuthorBook。一个 Author 实例可以匹配多个 Book 实例。

首先,在Django项目的 settings.py 文件中,我们需要配置数据库信息。在这里我们使用SQLite3数据库进行示例:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

接下来,定义 AuthorBook 模型:

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=200)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

在上述代码中,我们定义了两个模型。Author 模型有一个字段 nameBook 模型有一个字段 title 和一个 ForeignKey 字段 author,它指向 Author 模型。这意味着一个 Author 实例可以匹配多个 Book 实例。

接下来,我们打开Django的交互命令行工具,使用以下命令创建表格:

python manage.py makemigrations
python manage.py migrate

现在,我们可以在Django的交互命令行中添加数据。例如:

from myapp.models import Author, Book

author1 = Author(name='John Doe')
author1.save()

book1 = Book(title='Book 1', author=author1)
book1.save()

book2 = Book(title='Book 2', author=author1)
book2.save()

这样,我们就创建了一个名为 John DoeAuthor 实例,和两个 Book 实例:Book 1Book 2,这两个实例都与 John Doe 相关。

我们还可以通过以下代码获取所有 Author 实例的 Book 实例:

for author in Author.objects.all():
    books = author.book_set.all()
    print(author.name)
    for book in books:
        print(book.title)

多对多关系示例

我们接下来使用多对多关系的示例。我们将定义两个模型:BookAuthor。一个 Book 实例可以匹配多个 Author 实例,一个 Author 实例也可以匹配多个 Book 实例。

首先,在Django项目的 settings.py 文件中,我们需要配置数据库信息。在这里我们使用SQLite3数据库进行示例:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

接下来,定义 AuthorBook 模型:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)

class Author(models.Model):
    name = models.CharField(max_length=200)
    books = models.ManyToManyField(Book)

在上述代码中,我们定义了两个模型。Book 模型有一个字段 titleAuthor 模型有一个字段 name 和一个 ManyToManyField 字段 books,它指向 Book 模型。这意味着一个 Author 实例可以匹配多个 Book 实例,一个 Book 实例也可以匹配多个 Author 实例。

接下来,我们打开Django的交互命令行工具,使用以下命令创建表格:

python manage.py makemigrations
python manage.py migrate

现在,我们可以在Django的交互命令行中添加数据。例如:

from myapp.models import Author, Book

book1 = Book(title='Book 1')
book1.save()

book2 = Book(title='Book 2')
book2.save()

author1 = Author(name='John Doe')
author1.save()
author1.books.add(book1, book2)

这样,我们就创建了两个 Book 实例:Book 1Book 2,一个名为 John DoeAuthor 实例,并使用 add() 方法设置了 AuthorBook 实例之间的关系。

我们还可以通过以下代码获取所有 Book 实例的 Author 实例:

for book in Book.objects.all():
    authors = book.author_set.all()
    print(book.title)
    for author in authors:
        print(author.name)

结语

在Django中,ORM是Django模型组件的核心。Django ORM使用模型来表示与数据存储的交互,简化了从Python应用程序访问关系数据库的过程。我们可以使用ORM来定义与关系型数据库之间的关系,包括一对一、一对多和多对多关系。在实际项目中,我们需要根据具体的需求使用这些关系类型来设计数据模型,并且熟练掌握Django ORM的使用方法,能够帮助我们更好地管理应用程序中的数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Django ORM、一对一、一对多、多对多的全面讲解 - Python技术站

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

相关文章

  • 简单聊一下Uwsgi和Django的爱恨情仇

    项目目录:/root/app Uwsgi的配置文件 [uwsgi] # Python扩展包安装的地方 pythonpath=/usr/local/src/python3/lib/python3.5/site-packages # Django根目录 chdir=/root/app # wsgi.py跟根目录的相对路径 wsgi-file=app/wsgi.p…

    Django 2023年4月10日
    00
  • settings.py配置文件是什么?

    Django是一个高效的Web框架,可以轻松地搭建一个功能完善的Web应用程序,而其强大灵活的配置可以借助于settings.py文件实现。 设置调整 Django的settings.py文件包含一系列的配置选项,这些选项可以根据开发需求进行相应的调整和配置。这些选项包括但不限于以下内容: DEBUG:这是一个布尔值,表示是否启用调试模式。在调试模式下,Dj…

    Django 2023年3月12日
    00
  • 在Django中使用logging模块

    一、Django logging配置 1、在setting.py中配置 # 日志文件存放路径 BASE_LOG_DIR = os.path.join(BASE_DIR, “log”) # Logging配置 LOGGING = { ‘version’: 1, # 保留字 ‘disable_existing_loggers’: False, # 是否禁用Dja…

    Django 2023年4月16日
    00
  • 使用Django连接Mysql数据库步骤

    当使用Django时,连接Mysql数据库的步骤可以分为以下几步: 步骤1:安装Mysql数据库驱动 在连接Mysql数据库之前,需要确保已经安装了Mysql数据库驱动。常用的Mysql数据库驱动有mysqlclient和PyMySQL,可以根据自己的需要选择其中一种安装。在本示例中,我们将使用mysqlclient。 安装mysqlclient可以使用pi…

    Django 2023年5月16日
    00
  • Django模板系统

    Django 的模板系统是一个强大的工具,它提供了一种将数据和 HTML 页面分离的方法,从而让开发人员可以更容易地维护和修改代码。在本文中,我们将深入了解 Django 模板系统的各个方面,包括模板语法、模板继承和模板标签等。 模板语法 Django 模板系统使用类似于 Jinja2 的模板语法。模板语法的主要特点是使用双大括号 {% … %} 和单大…

    Django 2023年3月12日
    00
  • django 静态资源配置

    最近在学习一个项目,django框架,但当 render 模板时,模板里有引入的图片就访问不到, 这是因为 django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方式,之前你写的相对路径,绝对路径因为缺少静态文件路径而全部失效 解决办法: 步骤1:在settings.py文件的最后加上以下内容: STATIC_URL = ‘/…

    Django 2023年4月11日
    00
  • Django unittest测试框架特性详解

    Django是一个非常流行的Python web框架,其中包括一个集成的unittest测试框架。在本攻略中,我们将详细介绍如何使用Django unittest测试框架。 步骤1:创建测试模块 首先,我们需要创建一个测试模块来存储我们的单元测试。我们可以在项目的根目录中创建一个名为“tests.py”的文件,或者创建一个名为“tests”的目录,并在其中创…

    Django 2023年3月13日
    00
  • django 中多条件搜索

    Django中我们一般用orm进行数据的交互操作,单条件搜索比较方便,那多条件呢? 百度了一下,大部分都是如下图的解释(咱也不知道谁抄袭谁的,太可怕了),对我一点用也没有   吐槽完上面的,我们看看下面的代码(models就不晒了,直接上views),多条件查询一行代码就能搞定,我之前还在自己写if,else进行判断取值 @login_required de…

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