我正在使用Django Rest Framework开发应用程序,我遇到了问题。我试图让应用程序尽可能灵活,所以我希望有可能动态地为我的模型添加新的字段
例如:
我有模型机器人与字段ID和版本。
但随后用户想要添加一个新的字段,即机器人的所有者。
我能做什么,以便我可以使模型和序列化器反映出新的领域。我可以看到如何轻松地向数据库添加新字段,但模型和序列化程序不会反映此更改。
答案 0 :(得分:3)
我希望能够为我的模型动态添加新字段。
简短回答:你不能。
答案很长:您可以使用相关模型,其中每条记录将代表一个"字段"对于给定的Robot
实例,即:
class RobotField(models.Model):
robot = models.ForeignKey(Robot)
fieldname = models.CharField(max_length=30)
value = models.TextField()
class Meta:
unique_together = [("robot", "fieldname")]
然后正确处理价值(及其类型),验证等等,以及涉及这些"字段"的大多数查询。将成为PITA。
或者您可以存储"用户定义的"字段作为json在厨房水槽TextField中,但是让我们甚至不谈论SQL查询...
关键是,通常情况下,在模式中添加字段意味着使用字段添加相当多的业务域代码 - 因为通常添加字段的点是支持某些业务规则。
FWIW人们试图提供零代码用户可扩展模型"应用程序多年来,我还必须看到任何实际成功的应用程序。结果总是出现在充满反模式的膨胀代码库中(比如在数据库中存储用户编写的代码和模板)并且表现出糟糕的运行时性能 - 并且用户界面非常复杂,以至于用户每次需要任何演进时都要向开发人员付费他们应该能够自己做,为此花大价钱,因为膨胀的代码库和混乱的模型意味着在模型中添加简单字段这样简单的事情现在需要多五倍的工作。
IOW:保持简单愚蠢 - 代码通常是最简单的配置工具。
答案 1 :(得分:0)
如果你正在使用postgreSQL,你可以使用JSONField并将其他变量保存到这一个字段作为键值对。