[英]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.