在构建大型web后端时,我们面临着一个问题,即我们的模型具有很多属性。由于我们希望减少响应的大小以提高效率,因此我们对模型使用了不同的序列化程序。以这个简单的模型为例:
class Address(models.Model):
country_id = models.ForeignKey(Country, on_delete=models.PROTECT)
postal_code = models.CharField(max_length=10)
street = models.CharField(max_length=176)
number = models.CharField(max_length=20)
additional = models.CharField(max_length=256, blank=True, default='')
city = models.CharField(max_length=176)
state = models.CharField(max_length=50)
user = models.ForeignKey('user.User', on_delete=models.CASCADE)
仅此一项,我们就有一个ID序列化程序、一个StringSerializer (用于传递可用的字符串)、一个MinimalSerializer (用于多个地址的列表)、一个DetailSerializer (带有用于获取国家和用户详细信息的depth=1……
现在,由于这种复杂性,我们面临着几个问题,并考虑重新构建api,以便在请求中包含必需的字段。使用django + drf可以做到这一点吗?我们相信在Content Negotiation下找到了一些东西,但这是一个不同的主题。
发布于 2021-01-04 23:42:37
您可以像这样动态修改字段:
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)
欲了解更多信息,请访问drf docs。
https://stackoverflow.com/questions/65564518
复制相似问题