Django 我可以向我的模型/序列化程序/数据库中添加新字段吗?

Django 我可以向我的模型/序列化程序/数据库中添加新字段吗?,django,python-3.x,django-rest-framework,Django,Python 3.x,Django Rest Framework,我正在使用Django Rest框架开发一个应用程序,我遇到了一个问题。我试图使应用程序尽可能灵活,因此我希望能够动态地向模型中添加新字段。 例如: 我有一个机器人模型,有id和版本字段。 但是,用户希望添加一个新字段,即机器人的所有者。 我可以做些什么,这样我就可以使模型和序列化程序反映这个新字段。我可以看到如何轻松地向数据库添加新字段,但是模型和序列化程序将不会反映此更改 我希望能够动态地向模型中添加新字段 简单回答:你不能 详细回答:您可以使用一个相关的模型,其中每个记录将代表一个给定的R

我正在使用Django Rest框架开发一个应用程序,我遇到了一个问题。我试图使应用程序尽可能灵活,因此我希望能够动态地向模型中添加新字段。
例如:
我有一个机器人模型,有id和版本字段。 但是,用户希望添加一个新字段,即机器人的所有者。 我可以做些什么,这样我就可以使模型和序列化程序反映这个新字段。我可以看到如何轻松地向数据库添加新字段,但是模型和序列化程序将不会反映此更改

我希望能够动态地向模型中添加新字段

简单回答:你不能

详细回答:您可以使用一个相关的模型,其中每个记录将代表一个给定的
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存储在厨房水槽文本字段中,但我们甚至不必讨论SQL查询

关键是,在大多数情况下,向模式中添加字段意味着也要使用该字段添加相当多的业务域代码,因为添加字段的目的通常是支持某些业务规则

多年来,FWIW用户一直试图推出“零代码用户可扩展模型”应用程序,但我还没有看到任何应用程序真正成功地做到了这一点。结果总是以充斥着反模式(比如在数据库中存储用户编写的代码和模板)的臃肿代码库而告终,并表现出糟糕的运行时性能——用户界面如此复杂,以至于用户每次需要开发人员自己应该能做的任何改进时都要向他们付费,由于臃肿的代码库和复杂的模型,为此付出了巨大的代价,这意味着像在模型中添加一个简单字段这样简单的事情现在需要五倍多的工作量


IOW:保持简单愚蠢-代码通常是最简单的配置工具。

如果您使用postgreSQL,您可以使用,并将附加变量保存到这个字段中作为键值对。

我并不经常同意bruno的观点,但这很好地概括了它+1但有一个不同意见是使用TextField表示JSON。postgresql和mysql现在都对JSONFields有本机支持。@e4c5我知道pgsql对json有不错的支持,但在mysql中没有类似的支持。我来看看。Django还不支持mysql json字段,但希望它很快就会出现。这并不能解决相关业务规则、验证等问题;)绝对不是。我完全同意,这是我教过的,但这带来了一个问题。它不会反映所有的机器人。如果我添加一个新字段,我必须迭代所有的机器人来添加新字段