【问题标题】:Django Rest Framework Model Serializer Custom FieldDjango Rest Framework 模型序列化程序自定义字段
【发布时间】:2015-03-11 13:30:33
【问题描述】:

我正在使用 Django Rest Framework 和 AngularJS。 我有 TaskClient 模型。 Client 模型是 Task 的外键。

mInside serializers.pyClientSerializer() 看起来像:

class ClientBasicSerializer(serializers.ModelSerializer):

    class Meta:
        model = Client
        fields = ('id', 'name', 'gender')

TaskSerializer()(不工作)看起来像这样:

class TaskSerializer(serializers.ModelSerializer):
    client = serializers.PrimaryKeyRelatedField(read_only=True)
    client_data = serializers.ClientSerializer()

    class Meta:
        model = Task

可以看出:

  • client 只检索 PK。我用它来保存带有 AngularJS 资源的任务模型。
  • client_data 包含嵌套的客户端对象。我需要它来为用户显示客户端信息。

但是,它不起作用,因为 Django 客户端模型内部没有定义 client_data 字段(我认为我不应该定义它)。

如何将其定义为 TaskSerializer() 中的自定义字段,并且仍然可以利用 ClientSerializer()

【问题讨论】:

    标签: django angularjs django-rest-framework angular-resource


    【解决方案1】:

    您可以只使用client = serializers.ClientSerializer()

    然后,您需要重写 create 方法,以便将客户端实例分配给创建的任务实例。

    class TaskSerializer(serializers.ModelSerializer):
        client = serializers.ClientSerializer()
    
        class Meta:
            model = Task
    
        def create(self, validated_data):
    
            client_id = validated_data['client'] # this should be client id
            client = Client.objects.get(id=client_id)
            del(validated_data['client'])
            task = Task.objects.create(**validated_data)
            task.client = client
            task.save()
            return save. 
    

    【讨论】:

    • 我认为我的问题正好相反。 TaskSerializer 正在将完整的 Client 模型检索到视图,但我只需要在更新某个任务时传递 client_id,而不是完整的 Client 字典。如何更改上面的代码以反映此问题?
    • @BrunnoVodolaMartins 阅读我的代码,您不需要传递完整的 Client 字典,只需将 client id 作为 client 属性传递。在validated_data['client'] 中应该有client id
    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2023-02-08
    • 2017-06-07
    • 2014-01-05
    相关资源
    最近更新 更多