![](/img/trans.png)
[英]how to create periodictask in celery and django for an specific model instance
[英]Django model instance specific code
在我的Django模型中,我必须为每个模型实例添加特定的代码。 现在,我想知道什么是实现此目标的好方法。 我当前的尝试导致了一个很大的,很难阅读的if语句。
考虑以下模型:
class Foo(models.Model):
name = models.CharField(max_length=255)
def do_instance_specific_stuff(self, arg):
if self.id == 1:
do_X(arg)
elif self.id == 2:
do_Y(arg)
else:
do_Z()
目前,有大约20个模型实例的自定义代码,并且它将保持这种规模。 有什么想法或模式可以如何以一种清晰易读的方式实现?
谢谢你的帮助。
我将在您的模型中添加另一个字段, vendor
。 然后将每个供应商的方法添加到模型中,并使用getattr调用它们:
class Foo(models.Model):
name = models.CharField(max_length=255)
vendor = models.CharField(max_length=50)
def vendor_fedex(self, arg):
blah blah
def vendor_ups(self, arg):
blah blah
def vendor_usps(self, arg):
blah blah
def do_instance_specific_stuff(self, arg):
fn = getattr(self, "vendor_"+self.vendor, None)
if not fn:
raise Exception("Uh-oh, bad vendor")
fn(arg)
取决于id
特定值似乎非常脆弱。 在您的数据模型中,每个供应商字符串只会出现一次,但它是可读且可延展的。 如果getattr
找不到供应商代码,您可以决定要做什么。
常见的模式是使用dict
:
stuff_per_id = {1 : do_X, 2 : do_Y, ...}
def do_instance_specific_stuff(arg):
try:
stuff_per_id[self.id](arg)
except KeyError:
do_Z()
虽然您实际上不应该这样做。 最好在模型中放置一个额外的字段,以指示应为此实例在arg
上运行哪些代码。 dict
模式可能仍然有用。
编辑 :如果您的任何特定实例的功能可能会引发KeyError
,上述执行do_Z
。 如果您不希望这样做,请将未使用的参数添加到do_Z
并使用以下命令:
def do_instance_specific_stuff(arg):
try:
f = stuff_per_id[self.id]
except KeyError:
f = do_Z
f(arg)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.