Python以编程方式在类体中定义变量

时间:2017-06-23 17:01:48

标签: python django

我有两个django模型,模型Person和模型PersonTemplate具有完全相同的字段名称&类型,但Person中需要某些字段,但它们不在PersonTemplate中。只需将模型粘贴到这两个类中就足够了,但这涉及大量的硬编码,如果我编辑一个模型而忘记了另一个,那么东西可能会破坏。

我想到的解决方案是在一个带有布尔参数的函数中定义django模型字段,无论字段是否是必需的。像

这样的东西
def get_fields(is_required=True):
    first_name = models.CharField(max_length=128, verbose_name=_("First Name"),
                                  blank=is_required, null=is_required)
    last_name = models.CharField(max_length=128, verbose_name=_("Last Name"),
                                 blank=is_required, null=is_required)
    return locals()

class Person(models.Model):    
    vars = get_fields(True)

class PersonTemplate(models.Model):    
    vars = get_fields(False)

我不知道怎么做是将get_fields中的局部变量放入模型的类体中。任何人都有任何想法或建议,以更好的方式来实现这些模型?

2 个答案:

答案 0 :(得分:1)

Django有抽象模型,您可以使用它来定义重复的字段和方法,然后继承到您选择的实际模型。

对于动态必填字段,您可以使用模型方法设置其值,并在子模型中覆盖这些方法。请参阅this answer

这样的事情应该有效:

class AbstractPerson(models.Model):
    @staticmethod
    def get_first_name_requirement():
        return True

    @staticmethod
    def get_last_name_requirement():
        return True


    first_name = models.CharField(max_length=128, verbose_name=_("First Name"),
                                  blank=get_first_name_required.__func__(), null=get_first_name_required.__func__())
    last_name = models.CharField(max_length=128, verbose_name=_("Last Name"),
                                 blank=get_last_name_required.__func__(), null=get_last_name_required.__func__())
    class Meta(object):
        abstract = True

class Person(AbstractPerson):    
    @staticmethod
    def get_first_name_requirement():
        return True

    @staticmethod
    def get_last_name_requirement():
        return True


class PersonTemplate(AbstractPerson):    
    @staticmethod
    def get_first_name_requirement():
        return False

    @staticmethod
    def get_last_name_requirement():
        return False

我确信必须有更优雅的方式来动态分配空值。但这也将完成工作。

答案 1 :(得分:0)

为了实现您的想法,您需要使用元类。但像往常一样,这是个坏主意。 你为什么不看Django抽象模型和继承?这将以更加可读和简单的方式解决您的问题。