我正在尝试解耦2个应用,到目前为止,我已经将实现的不同部分分开了。然而,当解耦 django-admin 时,我陷入了困境。应用程序之间的依赖关系必须明确(即 NO循环依赖应存在于这些应用程序中)。然而,系统的可用性不应该受到严重损害。
在图书馆系统中,目录应用和持有应用已分离,其中目录仅涉及书目编目,而持有是关于图书馆拥有的书籍。
catalog.Book
是图书信息的模型holding.BookCopy
是本书的实体副本的模型。 Book
有BookCopy
个BookCopy
,而Book
属于# File: catalog/admin.py
from holding import models as holding_models
# ...
class BookCopyInline(TabularInline):
model = holding_models.BookCopy
class BookAdmin(ModelAdmin):
model = Book
inlines = [BookCopyInline]
admin.site.register(Book, BookAdmin)
。
很明显,持有应用必须依赖于目录,但目录不应取决于持有 。
BookCopyInline
问题:目录管理员与持有模型有依赖关系,使其成为反向的不必要的依赖关系。 (目录应用程序不应取决于持有,但持有可取决于目录)
将# File: catalog/admin.py
from holding import admin as holding_admin
class BookAdmin(ModelAdmin):
model = Book
inlines = [holding_admin.BookCopyInline]
admin.site.register(Book, BookAdmin)
# File: holding/admin.py
class BookCopyInline(TabularInline):
model = BookCopy
移至 holding / admin.py 。
git reset --hard origin/Dev
仍有循环应用程序依赖项,但我们只依赖于holding.admin,而不依赖于模型。哪个更好,但尚未完全解耦。
答案 0 :(得分:0)
此问题的一种可能解决方案是在保持模块中添加内联,并在保持模块内重新注册ModelAdmin。
# File: catalog/admin.py
class BookAdmin(ModelAdmin):
model = Book
# File: holding/admin.py
from catalog.admin import BookAdmin
class BookCopyInline(TabularInline):
model = BookCopy
BookAdmin.inlines.append(BookCopyInline)
admin.site.unregister(BookAdmin)
admin.site.register(catalog_models.Book, catalog_admin.BookAdmin)