繁体   English   中英

Django模型实例特定的代码

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM