管理相互关联模型的 Django 应用程序
Posted
技术标签:
【中文标题】管理相互关联模型的 Django 应用程序【英文标题】:Managing Django Apps for Inter-related models 【发布时间】:2016-10-20 17:23:42 【问题描述】:对于 Django,最佳实践显然是让 1 个应用程序只做 1 件事并正确地做 1 件事......这样它们就可以“插入并播放”到其他项目中
假设我有一个库应用程序,并且有 3 个应用程序。 book
、member
和 loan
。他们每个人都有自己的模型。
所以,在loan
中说forms.py
,我需要做这样的事情:
from book.models import Book
from member.models import Model
from .models import Loan
#Other key imports
class CreateLoanForm(forms.Form):
# Some fields
def save(self):
# Retrieve fields
selected_book = self.cleaned_data.get('selected_book')
selected_member = self.cleaned_data.get('selected_member')
new_loan = Loan(
book=Book.objects.get(id=selected_book),
member=Member.objects.get(id=selected_member),
date_start=self.cleaned_data.get('date_start'),
date_end=self.cleaned_data.get('date_end')
)
我的问题是:
-
上述
from book.models ...
不违反即插即用应用的能力吗?
有没有更好的方法来导入这些模型?我这样做是否违反了最佳做法?
【问题讨论】:
【参考方案1】:“一个应用做一件事,一件事正确”并不意味着它必须只有一个模型。如果您正在编写库应用程序,那么它应该在同一个应用程序中包含 book
、member
和 loan
模型。
但是,在您的问题的上下文中,在应用程序 B 中使用来自应用程序 A 的模型的一种可能做法是将模型定义为应用程序 B 中的可插入设置。例如,请参阅auth
模块在此处执行的操作:https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#substituting-a-custom-user-model
【讨论】:
可插入设置根本不是常见的做法,除非模型实际上必须是可插入的(如用户模型),这是少数情况。应用间依赖是你无法绕过的现实,如果依赖缺失,最好导入模型并让它快速失败。 @knbk,你是对的,因为这不是“常见”的做法,我已经相应地更新了我的答案。我不同意你的其余评论,但支持/再次争论这种方法不在答案的范围内。以上是关于管理相互关联模型的 Django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章