gpt4 book ai didi

python - ModelSerializer 是否应该按 View 编写?

转载 作者:太空宇宙 更新时间:2023-11-03 14:10:03 26 4
gpt4 key购买 nike

我正在编写一个 Django 应用程序,该应用程序非常庞大并且具有大量 API 端点。此应用程序使用 DRF 序列化通过 JSON 发送到前端的信息,并反序列化前端通过 JSON 发送的信息。

为了便于解释我的情况,让我们考虑一个简单的模型。假设我有一个模型 A

class A(models.Model):
field1 = models.CharField(max_length=255)
field2 = models.CharField(max_length=255)
field3 = models.CharField(max_length=255)

我对此类场景有自己的看法。

  • 创建:用户输入 field1,将根据该字段填充并保存 field2field3
  • 显示:匹配查询集中的每个模型上仅显示 field2
  • show_full:field2field3 都将显示在匹配查询集中的每个模型上

这让我想到了我的问题。我应该为上面的所有 View 分别编写一个 ModelSerializer 吗?或者 DRF 是否有一些工具可以在 View 本身中指定模型字段名称?如果序列化器是基于每个 View 编写的,那么序列化器与 View 的联系是否比模型更紧密?

谢谢你帮我。 DRF 文档和任何数量的 Google 搜索都未能解决我的问题。

最佳答案

您不必为每个 View 编写不同的序列化程序。相反,您可以使用它们的一些功能来实现您想要的:

1) 要使用单个字段进行创建,请将 field2field3 标记为只读。这样,在您创建模型时验证输入数据时就不会考虑它们。

2) 要根据 View 或不同 View 中输入的某些参数来决定显示哪些字段,您可以 dynamically modify the fields of the serializer :

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
"""
A ModelSerializer that takes an additional `fields` argument that
controls which fields should be displayed.
"""

def __init__(self, *args, **kwargs):
# Don't pass the 'fields' arg up to the superclass
fields = kwargs.pop('fields', None)

# Instantiate the superclass normally
super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

if fields is not None:
# Drop any fields that are not specified in the `fields` argument.
allowed = set(fields)
existing = set(self.fields)
for field_name in existing - allowed:
self.fields.pop(field_name)

关于python - ModelSerializer 是否应该按 View 编写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48573371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com