头部背景图

Django ManyToManyField ORM如何实现增查改删,Django多对多字段使用方法大全

:soogor 2022-06-04 17:54:41 :157
表结构设计假设一个作者有多本书,一本书也可以有个作者,多对多关系。# 表结构设计 class Book(models.Model):    title = models.CharField(max_length=20)

表结构设计
假设一个作者有多本书,一本书也可以有个作者,多对多关系。

# 表结构设计
class Book(models.Model):
   title = models.CharField(max_length=20)

class Author(models.Model):
   name = models.CharField(max_length=20)
   books = models.ManyToManyField(Book)


在admin中显示
当数据过多时,django自带的ManyToManyField及其不方便。仅需在admin.py添加如下字段即可。

# 修改前
admin.site.register(Author)


使用filter_horizontal。在作多项选择的操作方便性,及单项选择太多时,会有极好的体验。

# 修改后
class AuthorAdmin(admin.ModelAdmin):
    list_display = ['name']  # 列表页展示的字段
    filter_horizontal = ('cards',)
admin.site.register(AuthorAdmin)


若想在admin中显示cards字段。增加如下代码即可

class AuthorAdmin(admin.ModelAdmin):
    list_display = ['name','relatedbooks']  # 列表页展示的字段    
    def relatedbooks(self, obj):
        return [book.title for book in obj.books.all()]
    filter_horizontal = ('books',)
    
admin.site.register(Author,AuthorAdmin)


ORM操作
all 关联的所有的元组
一个作者的所有书。表Author中某一元组关联表Book中的所有元组

    author = models.Author.objects.get(pk=1)
    books = author.books.all()’
    for book in books:
        print(books.title)


add 添加多对多关系
重复添加同一关系django会自动忽略

    author = models.Author.objects.get(pk=1)
    author.books.add(Book.objects.all())
    author.books.add(Book.objects.get(id=3))


remove 多对多关系

    author = models.Author.objects.get(pk=1)
    author.books.remove(Book.objects.get(id=3))


set 替换
直接完整的替换某一多对多关系

    author = models.Author.objects.get(pk=1)
    author.books.set(Book.objects.get(id=3))


clear 清除
清除一元组所有多对多关系

    author = models.Author.objects.get(pk=1)
    author.books.clear()


一张表自关联

from django.db import models

class Person(models.Model):
    friends = models.ManyToManyField("self")


当django处理这个模型时,它会做如此定义:对多对多字段关系被认为是对称的——即,如果我是你的朋友,那么你也是我的朋友。(跟C++一比,我是你的友元,你不是我的友元)

然而有时候我们不需要这个友好关系,修改symmetrical为False即可。

symmetrical=Flase


 

本文编辑:soogor
暂无评论,期待你的首评
源码时代招聘(在源码时代学UI设计,就业率怎么样)

[编程]源码时代招聘(在源码时代学UI设计,就业率怎么样)

就业率怎么样有没有人了解源码时代软件测试课程的成都源码时代的就业率可不可信培训机构出来的程序员就业前景怎么样成都源码时代老师都是什么层次的有
2022年9月29日 19:00
网卡地址和mac地址(MAC就是网卡地址吗)

[IT百科]网卡地址和mac地址(MAC就是网卡地址吗)

本文目录MAC就是网卡地址吗什么是网卡mac地址关于MAC地址和网卡MAC地址什么命令可以查看网卡的mac地址网卡MAC地址是什么有什么用啊
2022年9月29日 18:45
无基础学编程有多难(考研想考编程专业但没基础,该怎么准备)

[编程]无基础学编程有多难(考研想考编程专业但没基础,该怎么准备)

零基础学习编程难吗很高兴回答这个问题,学计算机软件开发难不难零基础学习编程难吗28岁无基础学编程语言难吗考研想考编程专业但没基础,就是零基础
2022年9月29日 18:30
操作系统有哪些分类(操作系统按所提供的功能进行分类,可分为哪几类)

[IT百科]操作系统有哪些分类(操作系统按所提供的功能进行分类,可分为哪几类)

网络操作系统等批处理系统:首先,❤️操作系统的五大类型是什么操作系统的五大类型可以根据工作方式分为批处理操作系统、分时操作系统、实时操作系统
2022年9月29日 18:15
c语言struct结构体(c语言里面的结构体是什么意思)

[IT百科]c语言struct结构体(c语言里面的结构体是什么意思)

将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,struct的语句格式:struct
2022年9月29日 18:00
找对象的平台哪个比较靠谱(相亲网站哪个靠谱)

[IT百科]找对象的平台哪个比较靠谱(相亲网站哪个靠谱)

找对象, 找对象哪个网站好找对象百合网、世纪佳缘、珍爱网、有缘网都比较好,本文目录相亲网站哪个靠谱什么相亲网站比较靠谱除了三大婚恋网站(世纪
2022年9月29日 17:45
kowtow(中国人的叩头(kowtow)是怎么起源和发展的)

[IT百科]kowtow(中国人的叩头(kowtow)是怎么起源和发展的)

跪拜礼按照隆重程度依次为:稽首、顿首、空首、振动、吉拜、凶拜、奇拜、褒拜、肃拜,不能说咱们汉语的发展要借鉴下英文的发音,英文的发展也要借鉴下
2022年9月29日 17:30
python实现socket编程(如何用python开发移动App(android、iOS)后台需要掌握哪些技术)

[编程]python实现socket编程(如何用python开发移动App(android、iOS)后台需要掌握哪些技术)

这样一来我们就能使用 async/await 来运行它了怎么学习python自动化测试才好python自动化测试学习路线一、Python的应
2022年9月29日 17:15
take up to(take up的汉语意思是什么)

[编程]take up to(take up的汉语意思是什么)

指需要占用空间、时间或精力等,takesbuptoaplace带sb走向/接近takesbtoaplace带sb去一个地方take up 和
2022年9月29日 17:00
referer字段(网站防盗链怎么解决)

[编程]referer字段(网站防盗链怎么解决)

那么在HTTP请求中则不会包括Referer字段,访问页面B的HTTP请求会包括一个Referer字段,Referer HTTP头字段 当用
2022年9月29日 16:45
Copyright © 2022 All Rights Reserved 山东上格信息科技有限公司 版权所有

鲁ICP备20007704号

Thanks for visiting my site.