Django Rest Framework中是否有只提供特定属性的方法



在构建大型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

现在,由于这种复杂性,我们面临着几个问题,并考虑重组api以在请求中包含所需的字段。django+drf有可能做到这一点吗?我们相信会在内容谈判中找到一些东西,但这是一个不同的话题。

您可以动态修改如下字段:

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文档。

最新更新