綜述
Django
ManyToManyField
的ORM
操作和在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++
一比,我是你的友元,你不是我的友元
然而有時候我們不需要這個友好關係,修改symmetrical
爲False
即可。
symmetrical=Flase