Django细致讲解多对多使用through自定义中间表方法

下面为您详细讲解“Django细致讲解多对多使用through自定义中间表方法”的完整攻略。

1. 什么是多对多关系?

多对多关系是指两个模型之间的关系是“多对多”的,也就是说一个模型的实例可以同时有多个与另一个模型实例的关系。

在Django的ORM中,我们可以使用ManyToManyField来定义多对多关系。

2. 使用Django自带的多对多模式

在使用Django自带的多对多模式时,我们只需要在模型之间定义ManyToManyField即可。例如:

class Student(models.Model):
    name = models.CharField(max_length=20)

class Course(models.Model):
    name = models.CharField(max_length=20)
    students = models.ManyToManyField(Student)

这样,我们就定义了一个Student和Course之间的多对多关系。当我们向一个Course实例添加Student时,Django会自动创建一个中间表来保存这两个模型的关系,而我们不需要关心中间表的创建和维护。

3. 通过自定义中间表来完全控制多对多关系

在某些情况下,我们可能需要更加细致地控制多对多关系,并且需要在中间表中保存一些额外的信息。在这种情况下,我们可以使用through参数来定义自己的中间表模型,例如:

class Enrollment(models.Model):
    student = models.ForeignKey(Student, on_delete=models.CASCADE)
    course = models.ForeignKey(Course, on_delete=models.CASCADE)
    date_enrolled = models.DateField(auto_now_add=True)

class Student(models.Model):
    name = models.CharField(max_length=20)

class Course(models.Model):
    name = models.CharField(max_length=20)
    enrollments = models.ManyToManyField(Student, through=Enrollment)

在这个例子中,我们定义了一个Enrollment模型来保存学生和课程的关系,以及学生选择课程的时间。然后我们在Course模型中使用enrollments属性来表示多对多关系,并且通过设置through参数,将其关联到自定义的中间表模型上。

这样,当我们向一个Course实例添加Student时,Django会自动创建Enrollment对象,并且保存学生和课程的关系以及时间等额外信息。

4. 示例

我们通过以下的代码来演示多对多关系的使用,包括自定义中间表的创建和添加数据。

# models.py
class Enrollment(models.Model):
    student = models.ForeignKey('Student', on_delete=models.CASCADE)
    course = models.ForeignKey('Course', on_delete=models.CASCADE)
    date_enrolled = models.DateField(auto_now_add=True)

class Student(models.Model):
    name = models.CharField(max_length=20)

class Course(models.Model):
    name = models.CharField(max_length=20)
    enrollments = models.ManyToManyField(Student, through=Enrollment)

# views.py
from django.shortcuts import render
from .models import Student, Course, Enrollment

def index(request):
    # 创建学生
    s1 = Student.objects.create(name='Tom')
    s2 = Student.objects.create(name='Lucy')

    # 创建课程
    c1 = Course.objects.create(name='Python')
    c2 = Course.objects.create(name='Java')

    # 向课程添加学生,并保存额外信息
    Enrollment.objects.create(student=s1, course=c1, date_enrolled='2021-01-01')
    Enrollment.objects.create(student=s2, course=c2, date_enrolled='2021-01-01')
    Enrollment.objects.create(student=s1, course=c2, date_enrolled='2021-01-02')

    # 查询课程列表及对应的学生和选课时间
    courses = Course.objects.all()
    data = []
    for course in courses:
        students = course.enrollments.all()
        enrollments = Enrollment.objects.filter(course=course)
        enrollments_data = [{'student': e.student.name, 'date_enrolled': e.date_enrolled} for e in enrollments]
        data.append({'name': course.name, 'students': [s.name for s in students], 'enrollments': enrollments_data})

    return render(request, 'index.html', {'data': data})

在这个示例中,我们首先定义了三个模型,分别是Student、Course和Enrollment。然后我们创建了两个学生和两门课程,并通过自定义中间表的方式向课程添加学生,并保存了一些额外信息。

最后,我们查询了课程列表以及对应的学生和选课时间,并将数据传递给模板进行渲染。

这个示例演示了如何创建自定义的中间表,并将其与多对多关系关联起来,以及如何向中间表添加数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django细致讲解多对多使用through自定义中间表方法 - Python技术站

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

相关文章

  • Django框架(十九)–Django rest_framework-认证组件

    一、什么是认证 只有认证通过的用户才能访问指定的url地址,比如:查询课程信息,需要登录之后才能查看,没有登录,就不能查看,这时候需要用到认证组件 二、利用token记录认证过的用户 1、什么是token token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上…

    Django 2023年4月16日
    00
  • Django配置静态文件(CSS\js)及Django调用JS、CSS、图片等静态文件

    1 新建一项目: root@python:django-admin.py startproject csstest root@python:cd csstest root@python:ls csstest(__init__.py settings.py urls.py wsgi.py) manage.py 注:使用命令新建一项目文件,进入该项目,显示一个与…

    Django 2023年4月13日
    00
  • Windows下Python的Django框架环境部署及应用编写入门

    下面我详细讲解一下在Windows下Python的Django框架环境部署及应用编写入门的完整攻略。我们将分为以下几个步骤进行: 安装Python Python 是 Django 的核心依赖,我们需要安装 Python 以便于使用该框架。你可以在官网上下载 Python 的 Windows 安装包,下载地址是:https://www.python.org/d…

    Django 2023年5月16日
    00
  • uwsgi运行django应用是报错no app loaded. going in full dynamic mode

    今天测试uwsgi运行uwsgi.ini的时候,报错: 网上搜了一天,大都不知原因,还是google吧:github问题解决 说说问题原因吧:根据uwsgi的提示,应该是wsgi.py的application导入问题导致,根据报错,可以尝试用python 导入试试 python -c “from app.wsgi import application” 显然…

    Django 2023年4月13日
    00
  • Django Blog开发v1.0

    版本:1.0 版本说明: 1) 大部分来源于http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html 2) 自己测试用,使用svn比较方便   以下详细步骤 1. create foldermysite2 2. cmd to  mysite2django-admin.py startproj…

    Django 2023年4月13日
    00
  • Vue + Django实现分页实例讲解

    Vue + Django + BootstrapVue实现分页,前端后台实例讲解     1、后台Django代码      def storage(req): ”’ 存储图片接口: 1、根据roomid查询出数据 ”’ # 从数据库选出所需数据 roomid = req[‘roomid’] data_list = Memory.objects.filt…

    Django 2023年4月12日
    00
  • Django—models相关操作

    一、在django后台admin管理页面添加自己增加的表结构   通过终端命令:python3 manage.py makemigrations, python3 manage.py migrate   我们在Django自带的后台管理页面可以看到Django自动生成表结构,那么要是想成自己的表结构需要这么做:   首先web应用的models.py文件里面…

    Django 2023年4月10日
    00
  • 在Django中创建动态视图的教程

    下面是在Django中创建动态视图的完整攻略: 1. 在urls.py中配置动态视图的路径 首先要在项目的urls.py中配置动态视图的路径。在urls.py文件中添加以下代码: from django.urls import path from . import views urlpatterns = [ path(‘dynamic/’, views.dy…

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