Django模型层实现多表关系创建和多表操作

yizhihongxing

下面我将详细介绍一下 Django 模型层实现多表关系创建和多表操作的完整攻略,并提供两个示例实现。

1.多表关系创建

多表关系创建主要是通过外键关系来实现的,常见的外键关系有一对多关系和多对多关系。

1.1 一对多关系

1.1.1 示例1

例如,我们有两个模型类:AuthorBook,一个作者可以写多本书,因此作者模型是一对多关系的主表,书籍模型是一对多关系的副表。

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name

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

    def __str__(self):
        return self.title

注意到Book模型类中,ForeignKey字段表示外键关系,on_delete表示删除关联表记录时的行为,这里我们采用的是级联删除。

1.1.2 示例2

另一个例子是电商系统中购物车和商品之间的关系,一个购物车中可以有多个商品,是一对多关系。

from django.db import models

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE,)
    time =  models.DateTimeField(auto_now=True)

class CartItem(models.Model):
    cart = models.ForeignKey(Cart, on_delete=models.CASCADE,)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=0)

总的来说,使用一对多关系需要在多的一方定义一个外键,指向一的一方的主键,并指定删除行为。

1.2 多对多关系

多对多关系在 Django 中使用ManyToManyField类型来实现,它通过一个中间表来连接两个模型之间的关系。

1.2.1 示例1

例如,我们有两个模型类:BookAuthor,一本书可以有多个作者,也可以一个作者写作多本书。

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(max_length=100)

    def __str__(self):
        return self.name

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

    def __str__(self):
        return self.title

注意到Book模型类中,ManyToManyField字段指向了Author模型类。Django 会自动创建一个名为book_authors的中间表来保存两个模型之间的关系,我们无需在数据库中手动创建。

1.2.2 示例2

另一个例子是用户与组之间的关系。一个用户可以属于多个组,一个组也可以有多个用户。

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

    def __str__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=100)
    users = models.ManyToManyField(User)

    def __str__(self):
        return self.name

总的来说,使用多对多关系需要在其中一个模型中定义ManyToManyField,随后Django会自动创建一个中间表关系,保存两个表之间的关系。

2.多表操作

在多表操作中,我们可以通过 Dango 的 ORM 查询相关表中的数据,以及进行相关的操作,如增加、删除、更新、查询等。

2.1 查询数据

我们可以使用filterget等方法来进行查询,比如下面的例子是查询一个作者写的所有书籍:

books = Book.objects.filter(author__name='John')

其中author__name表示连表查询,查询Book表中外键关联的Author表中作者名为John的书籍。

2.2 增加数据

我们可以通过创建对象来添加一些数据,如下面的例子是添加了一个作者和他的一些书籍:

author = Author.objects.create(name='John', email='john@example.com')

book1 = Book.objects.create(title='My Book 1', author=author)
book2 = Book.objects.create(title='My Book 2', author=author)

2.3 更新数据

我们可以通过修改对象的属性来更新表中的数据,如下面的例子是修改某一本书的属性:

book = Book.objects.get(title='My Book 1')
book.title = 'New Title'
book.save()

2.4 删除数据

我们可以通过使用delete方法来删除表中的数据,如下面的例子是删除某一本书:

book = Book.objects.get(title='My Book 1')
book.delete()

综上所述,我们可以使用 Django 的 ORM 来进行多表关系的创建与操作,使得跨表查询和数据的增删改查非常方便。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django模型层实现多表关系创建和多表操作 - Python技术站

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

相关文章

  • Django权限机制实现代码详解

    下面是对“Django权限机制实现代码详解”的完整攻略,包括两个示例说明。 一、Django权限机制的概述 Django的权限机制允许开发者对不同用户(或用户组)授予不同的权限,以实现对应用程序访问的控制。Django自带的权限系统非常强大,能够满足大多数应用场景的要求。 在Django中实现权限控制需要掌握以下几个概念: 用户(User):指使用应用程序的…

    Django 2023年5月16日
    00
  • django Q和F查询

    Q查询——对对象的复杂查询F查询——专门取对象中某列值的操作 1、对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如: from django.db.models import Q news=New.objects.filter(Q(question__startswith=’What’)) 2、可以组合使用&…

    Django 2023年4月9日
    00
  • Django中的ajax请求

    接下来我将为你详细讲解Django中的Ajax请求的完整攻略,包含两个示例说明。 一、什么是Ajax请求 Ajax是Asynchronous JavaScript and XML的缩写,即使用JavaScript在不重新加载整个页面的情况下异步地与服务器交换数据。Ajax技术使用了XMLHttpRequest对象与服务器进行异步通信,然后使用JavaScri…

    Django 2023年5月16日
    00
  • Django 内置权限扩展案例详解

    这里是针对“Django 内置权限扩展案例详解”的完整攻略,包含两个示例说明的详细讲解。 1. 示例一 1.1 案例描述 假设我们要实现一个博客系统,需要实现以下功能: 所有用户都可以浏览博客列表和单篇博客。 未登录用户不能对博客进行任何操作(包括新建、修改、删除和点赞)。 登录用户可以进行以下操作: 创建自己的博客文章。 修改自己创建的博客文章。 删除自己…

    Django 2023年5月16日
    00
  • django Form 效验

    Django 登入效验 .py from django import forms from student import models from django.core.exceptions import ValidationError from django.core.validators import RegexValidator class RegFo…

    Django 2023年4月10日
    00
  • python笔记-20 django进阶 (model与form、modelform对比,三种ajax方式的对比,随机验证码,kindeditor)

    1、model的功能 1.1 创建数据库表 1.2 操作数据库表 1.3 数据库的增删改查操作 2、创建数据库表的单表操作 2.1 定义表对象 class xxx(models.MODEL) 2.2 定义字段   CharField EmailField TextField IntegerField AutoField BooleanField DateFi…

    Django 2023年4月13日
    00
  • Django WebEditor(CKeditor)

    涉及到的文件会在文章结尾给出下载地址!   1) 将 ckeditor 放在某个位置,只要你的settings可以搜索到,比如,我放在目录第一层,setting设置如下: INSTALLED_APPS = ( ‘ckeditor’, ) 2) 将静态文本放在static下。 目录结构应该为 : –static/    –ckeditor/        …

    Django 2023年4月13日
    00
  • Django ORM 事务和查询优化的操作方法

    我为你讲解一下“Django ORM 事务和查询优化的操作方法”的完整攻略。 事务 Django中的ORM默认开启了自动提交事务的功能,但是这样可能会造成一些意外情况如数据处理失败时数据库和应用数据不一致等问题。因此,可以通过设置事务来保证数据的一致性。 开启事务 在Django中使用事务很简单,只需要在使用前调用@transaction.atomic装饰器…

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