正如 Ohad 所建议的,最可靠的方法可能是在您希望对象一起显示的模型之间建立正式的关系。您在这里有几个选择。本质上,您将想要制作一个大师班,然后从中继承您的模型。如果您的模型在本体上与父概念相关,这很有意义。例如:
书籍和杂志都是出版物。它们都共享一些字段,例如标题和发布日期。但它们的不同之处在于,一本书通常只有一位作者,而杂志则有卷数和发行日期。 Django 已经使用Model inheritance 提供了几种不同的子类化方法。然而,在我自己尝试这些之后,我发现django-polymorphic extension 更好。这是一个使用 django-polymorphic 的 Django 3.0 应用程序的代码示例,该应用程序具有一个 Book 模型和一个 Magazine 模型,其中包含所有出版物的单个列表,显示系统中的所有书籍和杂志。
models.py
from django.db import models
from polymorphic.models import PolymorphicModel
class Publication(PolymorphicModel):
title = models.CharField(max_length=256)
publication_year = models.IntegerField()
class Book(Publication):
author_first = models.CharField(max_length=256)
author_last = models.CharField(max_length=256)
class Magazine(Publication):
volume_number = models.IntegerField()
issue_name = models.CharField(max_length=256)
admin.py
from django.contrib import admin
from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicChildModelFilter
from .models import Publication, Book, Magazine
class PublicationChildAdmin(PolymorphicChildModelAdmin):
""" Base admin class for all child models """
base_model = Publication # Optional, explicitly set here.
@admin.register(Book)
class BookAdmin(PublicationChildAdmin):
base_model = Book # Explicitly set here!
# show_in_index = True # makes child model admin visible in main admin site
list_display = ('title', 'publication_year', 'author_first', 'author_last')
@admin.register(Magazine)
class MagazineAdmin(PublicationChildAdmin):
base_model = Magazine # Explicitly set here!
# show_in_index = True # makes child model admin visible in main admin site
list_display = ('title', 'publication_year', 'issue_name')
@admin.register(Publication)
class PublicationParentAdmin(PolymorphicParentModelAdmin):
""" The parent model admin """
base_model = Publication # Optional, explicitly set here.
child_models = (Book, Magazine)
list_filter = (PolymorphicChildModelFilter,) # This is optional.
list_display = ('title', 'publication_year')
这当然只会显示那些常见的字段(在发布模型中)。如果您想显示每个模型特有的字段,则有各种技巧。这是一种快速的方法:
admin.py
...
@admin.register(Publication)
class PublicationParentAdmin(PolymorphicParentModelAdmin):
""" The parent model admin """
base_model = Publication # Optional, explicitly set here.
child_models = (Book, Magazine)
list_filter = (PolymorphicChildModelFilter,) # This is optional.
list_display = ('title', 'publication_year', 'issue', 'author')
def author(self, obj):
if obj.polymorphic_ctype.model == 'book':
book = Book.objects.get(pk=obj.pk)
return book.author_first + ' ' + book.author_last
return None
def issue(self, obj):
if obj.polymorphic_ctype.model == 'magazine':
return str(Magazine.objects.get(pk=obj.pk).issue_name)
return None
多田!