【发布时间】:2022-01-16 21:22:50
【问题描述】:
我在 Django 中为我的模型添加了一些扩展功能。为了不重载模型根接口(和文件),我使用了一些帮助器作为模型的属性。
我想要的是将方法和属性分组到这个助手中,我想要的是这样的:
class Product(models.Model):
downloads = DownloadsHelper()
# ....
pass
p = Product.objects.first()
p.downloads.files_count(p)
p.downloads.reset_permissions(p)
# ...
为了不必每次都将实例传递给助手,我可以使用另一种方法。
class Product(models.Model):
def __init__(self, *args, **kwargs):
super(Product, self).__init__(*args, **kwargs)
self.downloads = DownloadsHelper(self)
self.shipping = ShippingHelper(self)
p = Product.objects.first()
p.downloads.files_count
p.downloads.reset_permissions()
最后,一个更通用/概念化的方式来做这些事情是这样的:
class Helper:
def __init__(self, helped):
self.helped = helped
class Helper1(Helper):
attribute_name = 'helloing'
def hola(self): print("hola")
class Helper2(Helper):
attribute_name = 'goodbying'
def chau(self): print("chau")
class Helped:
def __init__(self):
self._install_helpers()
def _install_helpers(self):
for helper in self.helpers:
setattr(self, helper.attribute_name, helper(self))
class MyHelped(Helped):
helpers = [Helper1, Helper2]
h = MyHelped()
h.helloing.hola()
h.goodbying.chau()
问题是:从 pythonic-OOP 和“Djangoid”的角度来看,这最后一种方法是正确的方法/良好的做法吗?这有什么问题吗?
感谢阅读!
【问题讨论】:
-
您描述的第一种方法在我看来是最清晰/可维护的。这样,每个使用代码的人都可以快速知道您的模型具有哪些属性/帮助器。最后一种方式有点混乱,没有明确快速的方法来检查函数调用哪个属性
-
感谢您的回答。好的,好点。也许我可以使用元组列表或字典来分配帮助类的属性名称。我同意这有点神奇,但我不想在我使用此功能的每个模型中重复 __init__() 覆盖
标签: python django oop django-models helper