簡體   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