首页 > 解决方案 > ForeignKey 的序列化程序上的动态字段

问题描述

我设置了一个序列化程序,它能够动态序列化 Django Rest Framework 文档中指定的所需字段。

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)
>>> class UserSerializer(DynamicFieldsModelSerializer):
>>>     class Meta:
>>>         model = User
>>>         fields = ['id', 'username', 'email']
>>>
>>> print(UserSerializer(user))
{'id': 2, 'username': 'jonwatts', 'email': 'jon@example.com'}
>>>
>>> print(UserSerializer(user, fields=('id', 'email')))
{'id': 2, 'email': 'jon@example.com'}

然后,我将如何添加与 ForeignKey 相关的模型并动态序列化该模型中的所需字段?

我们可以制作模型

class User(models.Model):
    id = IntegerField()
    username = CharField()
    email = EmailField()

class Vehicle(models.Model):
    color = CharField()
    type = CharField
    year = DateField()
    driver = ForeignKey(User)

然后基于视图包括颜色、类型、年份或这些的任何组合。

我想要这样的东西。

{
  'id': 27,
  'username': 'testuser',
  'vehicle: {
     'color': 'Blue',
     'type': 'Truck',
  }
}

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


如果你想要一个嵌套的字典,你可以简单地做

class VehicleSeralizer(serialzers.ModelSerializer):
    class Meta:
        model = Vehicle
        fields = '__all__'

class UserSerializer(seralizers.ModelSerializer):
    vehicle = VehicleSerializer()
    class Meta:
         model = User
         fields = ['id', 'username', 'email'] # you might need to add 'vehicle'

推荐阅读