如何使用 Django 模型字段定义保持 DRY

Posted

技术标签:

【中文标题】如何使用 Django 模型字段定义保持 DRY【英文标题】:How to stay DRY with Django model field definitions 【发布时间】:2014-03-08 22:10:09 【问题描述】:

在定义 Django 模型字段时遵守 DRY 原则的最佳实践是什么。

场景一:

file_one = models.FilePathField(path=FIELD_PATH, allow_files=True, allow_folders=True, recursive=True)
file_two = models.FilePathField()
file_three = models.FilePathField()

我可以这样做吗:

file_one = models.FilePathField(path=FIELD_PATH, allow_files=True, allow_folders=True, recursive=True)
file_two = file_one
...

场景 2:

base = models.FilePathField(allow_files=True, allow_folders=True, recursive=True)
file_one = models.FilePathField(path=FIELD_PATH1)
file_two = models.FilePathField(path=FIELD_PATH2)
file_three = models.FilePathField(path=FIELD_PATH3)

如何让 file_one、_two 和 _three 继承/扩展 base = models... 中的规则,同时能够为每个规则分配不同的 path=...

我觉得Django: Dynamic model field definition 很接近,但不是我想要的!

保持令人敬畏的堆栈溢出!

【问题讨论】:

【参考方案1】:

老实说,DRY 代码很重要,应该努力争取,但也有限制 :) 在这种情况下,您在 DRY 和 python Explicit is better than implicit 的第二行代码之间存在分歧。如果我在维护你的代码,我宁愿进来看看:

file_one = models.FilePathField(path=FIELD_PATH1, allow_files=True, allow_folders=True, recursive=True)
file_two = models.FilePathField(path=FIELD_PATH2, allow_files=True, allow_folders=True, recursive=True)
file_three = models.FilePathField(path=FIELD_PATH3, allow_files=True, allow_folders=True, recursive=True)

因为虽然不是“DRY”,但发生了什么立即显而易见,我不必浪费时间去“等待,什么?”

(其实严格来说我想看到的是:

# Useful comments
file_one = models.FilePathField(
    path=FIELD_PATH1,
    allow_files=True,
    allow_folders=True,
    recursive=True
)

# Useful comments
file_two = models.FilePathField(
    path=FIELD_PATH2,
    allow_files=True,
    allow_folders=True,
    recursive=True
)

.. 但那是因为我是 PEP8 的忠实拥护者!):)

【讨论】:

哲学+1,但自从基普回答了我的问题......:p【参考方案2】:

我同意 Pete 的观点,您绝对不想让简单的模型定义变得过于棘手。通过将默认值保存在字典中并使用 ** 运算符,您可以使多个几乎相同的文件字段更易于管理并且仍然是明确的。比如:

filefield_defaults = 
    'allow_files':True, 
    'allow_folders':True, 
    'recursive':True


file_one = models.FilePathField(
    path=FIELD_PATH1,
    **filefield_defaults
)

file_two = models.FilePathField(
    path=FIELD_PATH2,
    **filefield_defaults
)

【讨论】:

+1 表示建议,U+2713 表示回答我的问题 :)

以上是关于如何使用 Django 模型字段定义保持 DRY的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 模型中为模型字段定义 json 类型

Django Admin:仅对一个模型字段使用自定义小部件

如何在 Django 管理员中为模型字段使用自定义表单字段?

以 DRY 方式创建活动/存档模型 (Django)

如何使用 django_graphene 解析 django 模型的自定义字段?

Django 表单:为继承模型组织创建/更新表单的最 DRY 方式