在 Django 模型中使用帮助程序扩展功能的正确方法是什么?



我正在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()

最后,一种更具python通用性/概念性的方法是:


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()

问题是:最后一种方法是从Python OOP和";Djangoid";观点。这有什么问题吗

感谢阅读!

也许您没有展示方法的全部复杂性,但从您展示的内容来看,它可以简化一点。

您可以使用";直接/简单";继承,如果您有很多方法,那么对于组织,您可以在方法名称前面加上h1_h2_,以指示它们来自哪个助手类:

from django.db import models
class Helper1:
def h1_hola(self):
print("hola")
class Helper2:
def h2_chau(self):
print("chau")
class MyHelped(Helper1, Helper2, models.Model):
pass
h = MyHelped()
h.h1_hola()
h.h2_chau()

这种更简单的方法足以满足您的特定需求吗?

相关内容

最新更新