是否可以为字段实现序列化程序?
我有一个自定义字段,它是models.TextField的子类:
...
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=<INSTANCE_CONNECTION_NAME>=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
...
我想在这样的Person模型中使用它:
class UpperCaseField(models.TextField):
pass
用户可以这样创建Person对象:
class Person(models.Model):
first_name = models.TextField()
last_name = UpperCaseField()
但是我想将其另存为student = Person(first_name='John', last_name='Doe')
,而不是John DOE
。
对于每个对象保存,我想在保存数据库之前将John Doe
转换为大写。因此我需要为last_name
编写一个序列化程序。我怎样才能做到这一点?我知道我可以使用预保存信号,也可以覆盖模型的UpperCaseField
方法,但是所有这些解决方案都是模型级解决方案。我想在字段级别执行此操作,因此我不必在使用save
作为字段的任何其他模型上重复相同的逻辑。
谢谢您的时间!
答案 0 :(得分:0)
您是否在DRF上下文中询问串行器?如果是这样,我想您想做的就是提供一种反序列化的方式,因此字段将以大写形式保存。
您可以通过子类化 Field 来定义自定义序列化器字段,如下所述:https://www.django-rest-framework.org/api-guide/fields/#custom-fields。在 to_internal_value 方法中,您可以将值转换为大写。然后,在模型序列化器中,可以将此自定义字段用于要另存为大写字母的模型字段。您不需要为此定义一个自定义模型字段,只需序列化程序字段就足够了。