基于Django mod中的字段值选择方法

2024-09-27 04:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

总之,我有一个Django模型,我希望实例根据其中一个字段的值具有不同的行为:

ANIMAL_TYPES = ('cow', 'african swallow', 'dog')
ANIMAL_TYPE_CHOICES = tuple(enumerate(ANIMALS, start=1))

class Animal(models.Model):
    animal_type = models.PositiveIntegerField(choices=ANIMAL_TYPE_CHOICES)
    # ... other model fields

    def speak_cow(self):
        return 'moo'

    def speak_african_swallow(self):
        return 'squawk'

    def speak_dog(self):
        return 'woof'

    choose_speak = {i: getattr(Animal,'speak_{}'.format(
             name.replace(' ', '_'))) for (i, name) in ANIMAL_TYPE_CHOICES}

    def speak(self):
        return Animal.speak[self.animal_type](self)

目标是能够在Animal的实例上调用speak(),并让类选择正确的speak方法。(需要说明的是:speak方法不仅仅返回一个字符串。)

这不起作用:Animal在我对choose_speak的词典理解中使用它时没有定义。目前,我的工作是使用

choose_speak = [None, speak_cow, speak_african_swallow, speak_dog]

但是有没有一种方法可以自动生成我想要的,这样我就不必手动添加任何我定义的新方法(例如speak_sheep)?你知道吗


Tags: 实例方法selfreturndeftypechoicesdog
2条回答

你也可以定义一个包含所有动物声音的列表。。。i、 e

 ANIMAL_SOUNDS = ['moo', 'squawk'..]

这样你就不用定义新方法了。 用它来说话,比如:

def speak(self):
    return ANIMAL_SOUNDS[self.animal_type]

编辑:

正是出于这个原因,我花了一点时间,用纯python编写了这段代码,这段代码可能与您想要的非常接近:

ANIMAL_TYPES = ('cow', 'african swallow', 'dog')
ANIMAL_TYPE_CHOICES = tuple(enumerate(ANIMAL_TYPES, start=1))

class Animal(object):

    def __init__(self, *args, **kwargs):
        self.choose_speak = {i: getattr(self, 'speak_{}'.format(
            name.replace(' ', '_'))) for (i, name) in ANIMAL_TYPE_CHOICES}

    animal_type = 1

    def speak_cow(self):
        return 'moo'

    def speak_african_swallow(self):
        return 'squawk'

    def speak_dog(self):
        return 'woof'

    def speak(self):
        return self.choose_speak[self.animal_type]()

animal = Animal()
animal.speak()

注意:重写模型的__init__不是Django的最佳实践,如here所示:

你需要的是getattr

def speak(self):
    method_name = choose_speak[self.animal_type]
    method = getattr(self, method_name)
    return method()

但如果我是你,我现在只会在speak中使用if ... else,因为它更简单、更明确。你知道吗

相关问题 更多 >

    热门问题