管理相互关联模型的 Django 应用程序

Posted

技术标签:

【中文标题】管理相互关联模型的 Django 应用程序【英文标题】:Managing Django Apps for Inter-related models 【发布时间】:2016-10-20 17:23:42 【问题描述】:

对于 Django,最佳实践显然是让 1 个应用程序只做 1 件事并正确地做 1 件事......这样它们就可以“插入并播放”到其他项目中

假设我有一个库应用程序,并且有 3 个应用程序。 bookmemberloan。他们每个人都有自己的模型。

所以,在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】:

“一个应用做一件事,一件事正确”并不意味着它必须只有一个模型。如果您正在编写库应用程序,那么它应该在同一个应用程序中包含 bookmemberloan 模型。

但是,在您的问题的上下文中,在应用程序 B 中使用来自应用程序 A 的模型的一种可能做法是将模型定义为应用程序 B 中的可插入设置。例如,请参阅auth 模块在此处执行的操作:https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#substituting-a-custom-user-model

【讨论】:

可插入设置根本不是常见的做法,除非模型实际上必须是可插入的(如用户模型),这是少数情况。应用间依赖是你无法绕过的现实,如果依赖缺失,最好导入模型并让它快速失败。 @knbk,你是对的,因为这不是“常见”的做法,我已经相应地更新了我的答案。我不同意你的其余评论,但支持/再次争论这种方法不在答案的范围内。

以上是关于管理相互关联模型的 Django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Django基础五之django模型层之关联管理器

Django Admin后台管理

Django:相互嵌套序列化程序

Rails:如何管理同步数据的两个表之间的关联?

将现有图像文件与 Django 模型相关联

Django 模型关联、用户、配置文件和想法模型