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

相关文章

  • Django logging日志配置 Django logging配置

      批注:做开发开不开日志,以下是我在工作中写Django项目常用的logging配置。 一个日志配置文件分为几个部分: (1)  定义日志的显示格式(formatters)==>> standard(标准版)、simple(简单版)、collect(收集版) (2)定义日志的过滤规则(filters) (3)日志流的处理方式(handlers)…

    Django 2023年4月13日
    00
  • django python manage.py runserver 流程

    这是自己的学习笔记,水平有限,很多地方没有仔细看,慎重阅读 启动 django demo 去 GitHub 的 Django 项目中下载 django-1.0.tar.gz,这是早期的版本,易于理解核心逻辑,并包含一个示例。 解压 django-1.0.tar.gz,目录 django 就是源代码,examples 是一个简单地 web 示例。 启动示例需要…

    Django 2023年4月10日
    00
  • django的登录注册系统的示例代码

    首先,需要先说明一下Django的登录注册系统是如何实现的。 Django使用的是MVC(Model-View-Controller)框架,其中登录注册系统主要是使用Django的auth模块实现的。 接下来,我将为你详细讲解Django的登录注册系统的示例代码的完整攻略。 示例1:Django用户注册系统的示例代码 步骤1:创建新的Django项目 可以使…

    Django 2023年5月15日
    00
  • django之定义统一返回数据格式与GET/POST装饰器

    1. 为了返回给网页前端的格式统一,定义一个通用的插件类,返回统一格式数据 # enconding:utf-8 “”” 定义一个插件类, “”” from django.http import JsonResponse,HttpResponse # 自定义状态码 class HttpCode(object): # 正常登陆 ok = 200 # 参数错误 p…

    Django 2023年4月13日
    00
  • Django 模型类(models.py)的定义详解

    我们一起来详细讲解下“Django 模型类(models.py)的定义详解”。 什么是Django模型类 Django 模型类是用来在数据库中创建表格的一个抽象,也是Django 框架中的一项非常重要的功能。模型类/数据模型是指定义方法中包含了存储数据的结构,将数据存储在数据库中,可以理解为Django的“数据表”。 通过Django模型类,可以通过定义属性…

    Django 2023年5月16日
    00
  • Django 权限管理(permissions)与用户组(group)详解

    Django 权限管理(permissions)与用户组(group)详解 什么是权限(permission)? 在 Django 中,权限指的是用户在应用程序中可以访问的特定资源(如: 页面、视图函数等)。Django 中使用权限来限制用户对资源的访问,从而保护安全性。 在 Django 中,权限是由 django.contrib.auth 应用程序提供的…

    Django 2023年5月15日
    00
  • terminal 报错:ImportError: Couldn’t import Django.

    1.问题   今天学习django,测试当前项目时遇到了莫名其妙的报错:    python manage.py runserver:ImportError: Couldn’t import Django. Are you sure it’s installed and available on your PYTHONPATH environment var…

    Django 2023年4月15日
    00
  • Django Rest framework FilterSet 设置 help_text

    问题描述: 在model中设置了help_text后,但并没有在drf的doc中显示 解决方法: 重载filter_for_field方法然后将help_text加到extra中 例: class UserFilter(rest_framework.FilterSet): class Meta: model = User fields = ‘__all__’…

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