Django:有没有办法序列化模型字段而不是模型?

Posted

技术标签:

【中文标题】Django:有没有办法序列化模型字段而不是模型?【英文标题】:Django: Is there a way to serialize a Model Field instead of Model? 【发布时间】:2019-03-14 20:38:12 【问题描述】:

有没有办法为字段实现序列化程序?

我有一个自定义字段,它是 models.TextField 的子类,如下所示:

class UpperCaseField(models.TextField):
   pass

我想在这样的 Person 模型中使用它:

class Person(models.Model):
   first_name = models.TextField()
   last_name = UpperCaseField()

用户可以像这样创建 Person 对象:

student = Person(first_name='John', last_name='Doe')

但我想将其保存为John DOE,而不是John Doe

对于每个对象保存,我想在保存数据库之前将last_name 转换为大写。所以我需要为UpperCaseField 编写一个序列化程序。我怎样才能做到这一点?我知道我可以使用预保存信号或者我可以覆盖模型的 save 方法,但所有这些解决方案都是模型级解决方案。我想在字段级别执行此操作,因此我不必在使用UpperCaseField 作为字段的任何其他模型上重复相同的逻辑。

感谢您的宝贵时间!

【问题讨论】:

对于那些想知道的人,我相信get_prep_value 解决了我的问题。我会进行研究和必要的测试,然后希望能用答案更新我的问题。 这与序列化无关。 ***.com/questions/19498740/… 【参考方案1】:

您是在询问 DRF 上下文中的序列化程序吗?如果是这样,我认为您想要做的是提供一种反序列化的方式,因此字段将以大写形式保存。

您可以通过继承 Field 来定义自定义序列化器字段,如下所述:https://www.django-rest-framework.org/api-guide/fields/#custom-fields。在 to_internal_value 方法中,您可以将值转换为大写。然后在您的模型序列化程序中,您可以将此自定义字段用于要保存为大写的模型字段。您无需为此工作定义自定义模型字段,只需序列化器字段就足够了。

【讨论】:

以上是关于Django:有没有办法序列化模型字段而不是模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除Django模型而不是数据库?

graphene-django:查询所有模型字段而不是请求的字段

Django Admin:如何只保存内联模型而不是父模型

序列化程序返回对象而不是字段

如何在 django 模型字段中强制执行 char(N) 数据类型而不是 varchar(N)

如何限制 Django 模型中数值字段的最大值?