不同的ModelField处理

时间:2015-12-05 08:22:34

标签: django django-models django-forms

我有一个用户需要输入贡献类型的场景。它可以是现金或材料。基于他的贡献类型,我需要将现金存储在IntegerField或CharField中的材料中。如果不在模型中创建两个字段并将一个字段保留为空字段,我该怎么做呢。

class Contribution(models.Model):

    CONTRIBUTION_TYPE_CASH = "cash"
    CONTRIBUTION_TYPE_MATERIAL = "material"

    CONTRIBUTION_TYPE_CHOICES = [
        (CONTRIBUTION_TYPE_CASH, _("cash")),
        (CONTRIBUTION_TYPE_MATERIAL, _("material"))
    ]


    contributor = models.ForeignKey(Contributor, related_name="donor", verbose_name=_("contributor"))
    type = models.CharField(max_length=20, choices=CONTRIBUTION_TYPE_CHOICES, verbose_name=_("contribution type"))

1 个答案:

答案 0 :(得分:0)

第一个变体,保留一个type,并确保根据django_polymorphic正确验证输入。即使实际值是数字,您也必须始终处理字符串。

第二个变体,使用模型继承并定义两个不同的模型,一个用于物质贡献,另一个用于现金贡献。您可以使用抽象父级,在这种情况下,您必须手动合并两个查询集以获取全局贡献列表。 您可以使用具体的父级并使用第三方软件包(例如void School () is a free function. School::School(){ is the definition of the constructor. )来无缝处理继承的实例。无论哪种方式,您都必须在后端创建适当的模型实例,即使您在前端使用相同的动态表单。