Django ManyToManyField - 插入 - ORM - admin中显示

3 篇文章 0 订阅
3 篇文章 0 订阅

综述

Django ManyToManyFieldORM操作和在admin中显示。

表结构设计

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

# 表结构设计
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++一比,我是你的友元,你不是我的友元

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

symmetrical=Flase
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值