我有两个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
中的局部变量放入模型的类体中。任何人都有任何想法或建议,以更好的方式来实现这些模型?
答案 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抽象模型和继承?这将以更加可读和简单的方式解决您的问题。