Django:有没有一种方法可以序列化模型字段而不是模型?

时间:2019-03-14 20:38:12

标签: python django python-3.x serialization orm

是否可以为字段实现序列化程序?

我有一个自定义字段,它是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作为字段的任何其他模型上重复相同的逻辑。

谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

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

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

相关问题