Django 之 ORM表之间的外键关联与多对多关系
admin
2023-07-08 20:04:27
0次

实现环境表结构:

Django 之  ORM表之间的外键关联与多对多关系

models.py表单创建与代码

from django.db import models

# Create your models here.

class Publisher(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64,null=False,unique=True)

    def __str__(self):
        return "publisher_name:{}".format(self.name)

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=128,null=False)
    publisher = models.ForeignKey(to=Publisher)           #外键关联

    def __str__(self):
        return "book_title:{}".format(self.title)

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16,null=False)
    book = models.ManyToManyField(to="Book")            #跟BOOK多对多关系

    def __str__(self):
        return "author_name:{}".format(self.name)

两个HTML文件(book.html与author.html)

Django 之  ORM表之间的外键关联与多对多关系

重点:查询author表,通过多对多的关系author_book这个表的基础,查找出书的名称。

Django 之  ORM表之间的外键关联与多对多关系

重点:通过book表的外键关联,查询出该书的出版社名称。

views.py处理函数

from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool
from django.shortcuts import HttpResponse,render,redirect
from ormtest import models
import pymysql
from django.views import View
# Create your views here.

def author_list(request):
    # author = models.Author.objects.get(id=1)
    # print(author.book.all())
    all_author = models.Author.objects.all()
    return render(request,"author.html",{"author_list":all_author})

def book_list(request):
    all_book = models.Book.objects.all()
    return render(request,"book.html",{"book_list":all_book})

展示效果

Django 之  ORM表之间的外键关联与多对多关系

Django 之  ORM表之间的外键关联与多对多关系

Author跟Book表多对多关系的增删改查方法

1、增加作者,并添加相应的书籍

相应函数功能

def add_author(request):
    if request.method == "POST":
        new_author_name = request.POST.get("author_name")
        #getlist方法,获取所有选择的书籍
        books = request.POST.getlist("books")
        #创建一个新的作者
        new_author_obj = models.Author.objects.create(name=new_author_name)
        #为该作者添加相应的关系书籍,为在author_book表中添加相应的记录
        new_author_obj.book.set(books)
        return HttpResponse("添加作者成功!")

    all_book = models.Book.objects.all()
    return render(request,"add_author.html",{"book_list":all_book})

    return HttpResponse("OK")

相应的html代码


    

作者姓名:

作品:

展示效果:
Django 之  ORM表之间的外键关联与多对多关系

2、删除作者代码:
def del_author(request):
    #从URL值取到要删除的作者id
    delete_id = request.GET.get("id")
    print(delete_id)
    #根据ID值取到要删除的对象,直接删除
    #1、去作者和书的关联表,把对应的关联记录删除
    #2、去作者表把作者删除
    models.Author.objects.get(id=delete_id).delete()
    return redirect("/ormtest/author/")
3、编辑作者
def edit_author(request):
    if request.method =="POST":
        #拿到提交过来的编辑后的数据
        edit_author_id = request.POST.get("author_id")
        new_author_name = request.POST.get("author_name")
        #拿到编辑后作者关联的书籍信息
        new_books = request.POST.getlist("books")
        #根据ID找到当前编辑的作者对象
        edit_author_obj = models.Author.objects.get(id=edit_author_id)
        #更新作者名字
        edit_author_obj.name = new_author_name
        #更新作者关联的书的对应关系
        edit_author_obj.book.set(new_books)
        #将修改提交到数据库
        edit_author_obj.save()
        #返回作者列表页,查看是否编辑成功
        return redirect("/ormtest/author/")

#html展示效果如添加页面同样

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...