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

yizhihongxing

基于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日

相关文章

  • Django中图片不显示

    很多教程没教对,导致Django中的图片不能正确的显示出来,经过多次踩坑,发现如下方法可以解决该问题。 1.setting.py中添加: STATIC_URL = ‘/static/’ STATICFILES_DIRS=[ os.path.join(BASE_DIR,’static’).replace(‘\\’,’/’) ] 注意在这里BASE_DIR在se…

    Django 2023年4月12日
    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云端留言板实例详解

    一、Django云端留言板实例详解 这篇文章将详细讲解如何使用Django创建一个云端留言板的实例。 安装Django和必要的数据库驱动 在开始之前,需要先安装Django以及相应的数据库驱动。可以通过以下命令安装: pip install Django pip install django-mysql 创建Django项目 使用Django创建一个新项目,…

    Django 2023年5月15日
    00
  • django 简单会议室预约(1)

    django 是python的一个web框架,为什么要用django,作者之前用过另一个框架flask,虽然flask比较简单很容易让人学,但是flask没有整体感,会让初学着茫然。 这里我们用django。现在最新版本是django-1.9.2。从1.7开始就有点区别了,后面会讲到。 首先搭建环境: Ubuntu 14.04 Python 2.7.6 Dj…

    Django 2023年4月11日
    00
  • django的模型类管理器——数据库操作的封装详解

    我们来详细讲解一下“Django的模型类管理器——数据库操作的封装详解”。这个话题我们分为以下几个部分: 什么是模型类管理器? 模型类管理器的使用示例 自定义模型类管理器 示例说明:通过模型类管理器查询数据 示例说明:通过自定义模型类管理器查询数据 什么是模型类管理器? 在Django中,模型类管理器objects是Django用于对数据库进行操作的一个核心…

    Django 2023年5月16日
    00
  • Python – Django – 删除作者

    修改 author_list.html,添加删除按钮 <!DOCTYPE html> <html lang=”en”> <head> <meta charset=”UTF-8″> <title>作者列表</title> </head> <body> <h1&…

    Django 2023年4月10日
    00
  • Python Django的安装配置教程图文详解

    下面我将对“Python Django的安装配置教程图文详解”的完整攻略进行详细讲解,包括两条示例说明。 Python Django安装配置教程图文详解 安装Python 首先需要安装Python。前往Python官网下载最新版Python安装包,下载地址为:https://www.python.org/downloads。 下载对应平台的Python安装包…

    Django 2023年5月16日
    00
  • django uwsgi websocket踩坑

    https://www.cnblogs.com/Xjng/p/4853080.html 上面的是参考内容, 我的环境如下,python2.7,django1.11,uwsgi2.0以上,niginx作为代理 安装openssl: apt-get install libssl-dev, 安装完这个uwsgi要重新装 客户端是用的websocket作为发送的,p…

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