代码之家  ›  专栏  ›  技术社区  ›  creyD Ratha Pech

Django Rest Framework中有没有一种方法可以只提供特定的属性?

  •  0
  • creyD Ratha Pech  · 技术社区  · 5 年前

    在构建大型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(深度=1,用于获取国家和用户详细信息。。。

    现在,由于这种复杂性,我们面临着几个问题,并考虑重组api以在请求中包含所需的字段。使用django+drf可以吗?我们相信能在下面找到东西 Content Negotiation 但这是另一个话题。

    0 回复  |  直到 5 年前
        1
  •  1
  •   Shayan    5 年前

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

    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 .