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

綜述

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章