Django Rest Framework-如何在序列化器中嵌套多个字段?

我有几个控制字段的基本模型。其中一个位置字段由纬度,经度,准确性,提供者和客户时间组成。我的大多数可写模型(因此也包括资源)都是从该基本模型继承的。

我正在尝试使DRF序列化嵌套的“位置”字段中与位置相关的字段。例如,

{
 "id": 1, 
 "name": "Some name",
 "location": { 
   "lat": 35.234234, 
   "lon": 35.234234,
   "provider": "network", 
   "accuracy": 9.4, 
 }
}

我要记住,这些字段是基本模型上的常规(平坦)字段,这一点很重要。

我已经调查并找到了几种选择

  1. 创建一个自定义字段,并通过覆盖“ get_attribute”来创建嵌套表示。我不喜欢这种解决方案,因为我失去了模型序列化器的一些好处,例如验证。

  2. 创建一个称为位置的嵌套资源。我想我可以通过在模型上添加相同名称的属性来使其工作,但同样,无需验证。

所以我的问题是,在DRF序列化器中嵌套(或分组)多个字段的最佳方法什么?

DRF 3.0.0,Django 1.7

编辑:

在@Tom Christie之上构建答案,这就是我想出的(简体)

# models.py
class BaseModel(models.Model):
  id = models.AutoField(primary_key=True)
  lat = models.FloatField(blank=True, null=True)
  lon = models.FloatField(blank=True, null=True)
  location_time = models.DateTimeField(blank=True, null=True)
  location_accuracy = models.FloatField(blank=True, null=True)
  location_provider = models.CharField(max_length=50, blank=True, null=True)

  @property
  def location(self):
    return {
      'lat': self.lat,
      'lon': self.lon,
      'location_time': self.location_time,
      'location_accuracy': self.location_accuracy,
      'location_provider': self.location_provider
    }

class ChildModel(BaseModel):
  name = models.CharField(max_lengtg=10)


# serializers.py
class LocationSerializer(serializers.Serializer):
  lat = serializers.FloatField(allow_null=True, required=False)
  lon = serializers.FloatField(allow_null=True, required=False)
  location_time = serializers.DateTimeField(allow_null=True, required=False)
  location_accuracy = serializers.FloatField(allow_null=True, required=False)
  location_provider = serializers.CharField(max_length=50,allow_null=True, required=False)


class BaseSerializer(serializers.ModelSerializer):

  def create(self,validated_data):
    validated_data.update(validated_data.pop('location',{}))
    return super(BaseSerializer,self).create(validated_data)

  def update(self, instance, validated_data):
    location = LocationSerializer(data=validated_data.pop('location',{}), partial=True)
    if location.is_valid():
      for attr,value in location.validated_data.iteritems():
        setattr(instance,attr,value)
    return super(BaseSerializer,self).update(instance, validated_data)

class ChildSerializer(BaseSerializer):
    location = LocationSerializer()

    class meta:
      model = ChildModel
      fields = ('name','location',)

我已经使用有效/无效的帖子/补丁进行了测试,并且效果很好。

谢谢。

汤姆·克里斯蒂

我建议只使用显式的序列化器类,并显式地编写字段。它有点冗长,但简单,明显且可维护。

class LocationSerializer(serializers.Serializer):
    lat = serializers.FloatField()
    lon = serializers.FloatField()
    provider = serializers.CharField(max_length=100)
    accuracy = serializers.DecimalField(max_digits=3, decimal_places=1)

class FeatureSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=100)
    location = LocationSerializer()

    def create(self, validated_data):
        return Feature.objects.create(
            name=validated_data['name'],
            lat=validated_data['location']['lat'],
            lon=validated_data['location']['lat'],
            provider=validated_data['location']['provider'],
            accuracy=validated_data['location']['accuracy']
        )

    def update(self, instance, validated_data):
        instance.name = validated_data['name']
        instance.lat = validated_data['location']['lat']
        instance.lon = validated_data['location']['lat']
        instance.provider = validated_data['location']['provider']
        instance.accuracy = validated_data['location']['accuracy']
        instance.save()
        return instance

可以使用很多ModelSerializer方法来代替它们,或者使createandupdate方法更短一些,但是尚不清楚您要给自己的额外间接方法是否值得。

我们几乎总是对要构建的API使用完全显式的序列化器类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Django REST Framework中创建多个没有重复的可写嵌套序列化器的模型实例?

来自分类Dev

Django Rest Framework-如何序列化嵌套字段

来自分类Dev

如何在序列化器/视图Django REST Framework中合并多个模型?

来自分类Dev

Django Rest Framework中的序列化器字段筛选?

来自分类Dev

如何在Django Rest Framework中序列化ChoiceFields?

来自分类Dev

如何在Django Rest Framework嵌套序列化程序中动态更改深度?

来自分类Dev

Django Rest Framework具有多个嵌套对象的可写嵌套序列化器

来自分类Dev

Django Rest Framework可写嵌套序列化器

来自分类Dev

Django REST Framework嵌套的序列化器无效

来自分类Dev

Django Rest Framework嵌套的序列化器创建方法

来自分类Dev

Django Rest Framework的双重嵌套序列化器

来自分类Dev

Django Rest Framework嵌套序列化器

来自分类Dev

Django REST Framework序列化器字段必填= false

来自分类Dev

Django REST Framework序列化器字段必填= false

来自分类Dev

序列化器上的Django Rest Framework条件字段

来自分类Dev

Django Rest Framework-筛选序列化器字段

来自分类Dev

从Django Rest Framework序列化器中排除字段

来自分类Dev

Django Rest Framework序列化器-返回相关字段

来自分类Dev

不同的字段类型序列化器 - Django Rest Framework

来自分类Dev

如何在 Django REST Framework API 的 OneToOne 序列化器字段上允许空白字段?

来自分类Dev

嵌套关系序列化程序中的Django Rest Framework模型ID字段

来自分类Dev

在Django Rest Framework 3中使用可写的嵌套序列化程序创建多个对象

来自分类Dev

如何在Django REST Framework中正确嵌套序列化程序?

来自分类Dev

如何使用Django Rest Framework将url字段添加到序列化器

来自分类Dev

Django REST Framework如何限制用户对某些序列化器字段的访问

来自分类Dev

Django Rest Framework-在序列化器中获取相关模型字段

来自分类Dev

Django REST Framework 3中的其他序列化器字段

来自分类Dev

无法在Django Rest Framework序列化器的validated_data中获取非模型字段

来自分类Dev

Django Rest Framework-仅反序列化的序列化器字段

Related 相关文章

  1. 1

    如何在Django REST Framework中创建多个没有重复的可写嵌套序列化器的模型实例?

  2. 2

    Django Rest Framework-如何序列化嵌套字段

  3. 3

    如何在序列化器/视图Django REST Framework中合并多个模型?

  4. 4

    Django Rest Framework中的序列化器字段筛选?

  5. 5

    如何在Django Rest Framework中序列化ChoiceFields?

  6. 6

    如何在Django Rest Framework嵌套序列化程序中动态更改深度?

  7. 7

    Django Rest Framework具有多个嵌套对象的可写嵌套序列化器

  8. 8

    Django Rest Framework可写嵌套序列化器

  9. 9

    Django REST Framework嵌套的序列化器无效

  10. 10

    Django Rest Framework嵌套的序列化器创建方法

  11. 11

    Django Rest Framework的双重嵌套序列化器

  12. 12

    Django Rest Framework嵌套序列化器

  13. 13

    Django REST Framework序列化器字段必填= false

  14. 14

    Django REST Framework序列化器字段必填= false

  15. 15

    序列化器上的Django Rest Framework条件字段

  16. 16

    Django Rest Framework-筛选序列化器字段

  17. 17

    从Django Rest Framework序列化器中排除字段

  18. 18

    Django Rest Framework序列化器-返回相关字段

  19. 19

    不同的字段类型序列化器 - Django Rest Framework

  20. 20

    如何在 Django REST Framework API 的 OneToOne 序列化器字段上允许空白字段?

  21. 21

    嵌套关系序列化程序中的Django Rest Framework模型ID字段

  22. 22

    在Django Rest Framework 3中使用可写的嵌套序列化程序创建多个对象

  23. 23

    如何在Django REST Framework中正确嵌套序列化程序?

  24. 24

    如何使用Django Rest Framework将url字段添加到序列化器

  25. 25

    Django REST Framework如何限制用户对某些序列化器字段的访问

  26. 26

    Django Rest Framework-在序列化器中获取相关模型字段

  27. 27

    Django REST Framework 3中的其他序列化器字段

  28. 28

    无法在Django Rest Framework序列化器的validated_data中获取非模型字段

  29. 29

    Django Rest Framework-仅反序列化的序列化器字段

热门标签

归档