Django数据表关联关系映射

yizhihongxing

Django框架中的数据表关联关系映射是很重要的一个方面。Django提供了多种数据表关联方式。本篇文章将详细介绍Django中的数据表关联关系映射完整攻略,过程中提供代码示例。

一对一关系

在Django中,一对一关系是通过OneToOneField类型来实现的,如下所示:

from django.db import models

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

class Contact(models.Model):
    email = models.EmailField()
    person = models.OneToOneField(
        Person,
        on_delete=models.CASCADE,
        primary_key=True,
    )

在上述代码中,Contact模型与Person模型之间是一对一关系,通过OneToOneField类型定义。一个Person模型可以拥有一个Contact模型,而一个Contact模型也只能属于一个Person模型。

一对多关系

在Django中,一对多关系是通过ForeignKey类型来实现的,如下所示:

from django.db import models

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

class Phone(models.Model):
    number = models.CharField(max_length=20)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)

在上述代码中,Phone模型与Person模型之间是一对多关系,通过ForeignKey类型定义。一个Person模型可以拥有多个Phone模型,而一个Phone模型只能属于一个Person模型。

多对多关系

在Django中,多对多关系是通过ManyToManyField类型来实现的,如下所示:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    friends = models.ManyToManyField("self")

    def __str__(self):
        return self.name

在上述代码中,Person模型与自身之间是多对多关系,通过ManyToManyField类型定义。一个Person模型可以拥有多个朋友(Person模型),而一个Person模型也可以被多个朋友(Person模型)所拥有。

多表关联

在Django中,多表关联可以通过多个一对多关系、一对一关系或多对多关系来实现。例如,我们可以将一个Person模型与多个Group模型关联,如下所示:

from django.db import models

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

class Group(models.Model):
    name = models.CharField(max_length=30)
    members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

在上述代码中,Person模型和Group模型之间是多对多关系,通过ManyToManyField类型定义。Membership模型是自定义的多对多关系中间模型,增加了一些额外的字段。这些额外的字段可以记录加入组的日期、邀请理由等信息。

反向关系

在Django中,我们可以通过定义反向关系来访问与当前模型相关的模型。例如,我们可以访问一个Person模型的所有朋友,如下所示:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    friends = models.ManyToManyField("self")

    def __str__(self):
        return self.name

p1 = Person.objects.create(name='Alice')
p2 = Person.objects.create(name='Bob')
p3 = Person.objects.create(name='Charlie')
p4 = Person.objects.create(name='Dave')

p1.friends.add(p2)
p1.friends.add(p3)
p2.friends.add(p4)

# 访问p1的所有朋友
p1.friends.all()  # 返回QuerySet,包含p2和p3

# 访问p2的所有朋友
p2.friends.all()  # 返回QuerySet,包含p1和p4

在上述代码中,我们使用了ManyToManyField类型来定义一个Person模型与自身的多对多关系。通过访问这个模型的friends属性,我们可以访问与之相关的其他Person模型。使用反向关系,我们可以访问另一个Person模型的friends属性。

以上就是Django数据表关联关系映射完整攻略的详细介绍,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django数据表关联关系映射 - Python技术站

(0)
上一篇 2023年3月12日
下一篇 2023年3月12日

相关文章

  • Pyinstaller打包django

    偶有特殊要求可能需要将django程序打包成exe可执行文件,方便在电脑直接点击运行。这里用的是打包python代码的常用库Pyinstaller. 虽然用Pyinstaller支持打包Django,但也存在一些坑,在此记录一下。 环境: Python 3.6 Django 2.0 Pyinstaller 3.4 打包开始之前,先确定写的django程序能否…

    Django 2023年4月11日
    00
  • django session源码剖析

    django之所以能实现登陆认证,依靠的是一个叫sessionid的东西,该id记录了你的认证信息,如果你不喜欢这个名称,你也可以通过修改settings配置SESSION_COOKIE_NAME settings解说之session # Cache to store session data if using the cache session backe…

    Django 2023年4月11日
    00
  • Django REST framework 单元测试

    只是简单记录一下测试代码怎么写 环境 Win10 Python3.7 Django2.2 项目 参照官网 快速开始 写了一个 demo 测试 参照官网 测试和 Django 的测试差不多 创建 tutorial/tests/tests.py import json from django.test import TestCase from rest_fram…

    Django 2023年4月10日
    00
  • Django-rest framework的安装与使用

    目录 01-03 Django-rest framework的安装与使用 1.安装与配置 2.如何使用 01-03 Django-rest framework的安装与使用 1.安装与配置 ​ 1)安装drf:pip install dajngorestframework ​ 2)项目settings.py注册app:INSTALLED_APPS = [ ..…

    Django 2023年4月13日
    00
  • Django笔记十五之in查询及date日期相关过滤操作

    这一篇介绍关于范围,日期的筛选 in range date year week weekday quarter hour 1、in in 对应于 MySQL 中的 in 操作,可以接受数组、元组等类型数据作为参数: Blog.objects.filter(id__in=[1,2,3]) 对应的 SQL 是: select * from blog_blog w…

    2023年4月10日
    00
  • Django- filter和simpletag,inclusion_tag的用法

    filter的用法: #先引入template from django import template #声明register,名字只能是register register = template.Library() #带名字的装饰器,调用的时候用起的名字 如dsb @register.filter(name=’dsb’) def add_sb(value, …

    Django 2023年4月12日
    00
  • CentOS7下部署Django项目详细操作步骤

    详细步骤(下面步骤都是ROOT权限执行): 一、更新系统软件包yum update -y 二、安装软件管理包和可能使用的依赖 yum -y groupinstall “Development tools” yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel s…

    Django 2023年4月12日
    00
  • Django项目在pycharm新建的步骤方法

    Sure, 下面我来为你详细讲解在Pycharm中新建Django项目的步骤方法。 步骤 打开Pycharm,选择Create New Project。 在左侧选择”Python”,并向下滚动以找到Django。 点击Django,填写项目名称,选择虚拟环境,然后选择创建。 创建项目后,你会被带到Pycharm的编辑器窗口。右侧将出现Project环境,其中…

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