在定义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
...
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)
如何让{_ 1}}中的file_one,_two和_three继承/扩展规则,同时为每个base = models...
分配path=...
我觉得Django: Dynamic model field definition很接近但不是我正在寻找的东西!
保持棒极了Stack Overflow!
答案 0 :(得分:5)
老实说,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)
因为虽然不是“干”,但是很明显发生了什么,我不必浪费时间去“等,什么?”
(实际上严格来说,我希望看到的是:
# 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 :(得分:4)
我同意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
)