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

2024-04-27 04:17:16 发布

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

我有两个django模型,modelPerson和modelPersonTemplate,它们具有完全相同的字段名和类型,只是有些字段在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放到模型的类主体中。有人对如何更好地实现这些模型有什么想法或建议吗?你知道吗


Tags: djangoname模型truefieldsverbosegetis
2条回答

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

我相信一定有更优雅的方式动态分配空值。但这也能完成任务。你知道吗

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

相关问题 更多 >