我有一个用户需要输入贡献类型的场景。它可以是现金或材料。基于他的贡献类型,我需要将现金存储在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"))
答案 0 :(得分:0)
第一个变体,保留一个type
,并确保根据django_polymorphic
正确验证输入。即使实际值是数字,您也必须始终处理字符串。
第二个变体,使用模型继承并定义两个不同的模型,一个用于物质贡献,另一个用于现金贡献。您可以使用抽象父级,在这种情况下,您必须手动合并两个查询集以获取全局贡献列表。 或您可以使用具体的父级并使用第三方软件包(例如void School () is a free function.
School::School(){ is the definition of the constructor.
)来无缝处理继承的实例。无论哪种方式,您都必须在后端创建适当的模型实例,即使您在前端使用相同的动态表单。