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:有没有办法序列化模型字段而不是模型?的主要内容,如果未能解决你的问题,请参考以下文章
graphene-django:查询所有模型字段而不是请求的字段