0

所以这是我的文件 - Models.py

class Model1(models.Model):
    user = models.ForeignKey(User)
    other_fields = models.CharField(max_length=40)

序列化程序.py

class MySerializer(ModelSerializer):
    class Meta:
        model = Model1
        fields = '__all__'


Here  json request
{"user_id":1, "other_fields":"details"}

在views.py中

serializer = MySerializer(data=request.data)
serializer.data

**Throws keyerror "user"**

当我尝试将请求参数“user_id”更改为“user”时,它对我有用。但我无法更改请求 json。有没有办法在序列化程序中处理这个问题?

我可以将所有字段设置为“ _all_ ”,但由于字段数量众多,这不是一个好的解决方案。

我也试过 -

 class MySerializer(ModelSerializer):
    user = serializers.CharField(source='user_id')
    class Meta:
        model = Model1
        fields = '__all__'

但这对我不起作用。

4

3 回答 3

1

尝试这个:

class MySerializer(ModelSerializer):
    user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source='user', write_only=True)
    class Meta:
        model = Model1
        fields = '__all__'
于 2018-09-04T14:42:39.570 回答
1

我假设您正在viewset为您的观点使用类。那么这将工作

覆盖该__init__方法,

class MySerializer(ModelSerializer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'view' in self.context and self.context['view'].action in ['create', 'update', 'partial_update']:
            self.fields['user_id'] = self.fields.pop('user')

    class Meta:
        model = Model1
        fields = '__all__'



这些['create', 'update', 'partial_update']是分别代表HTTP POSTHTTP PUTHTTP PATCHactions的类。viewset

于 2018-09-04T14:40:12.030 回答
1

尝试使用PrimaryKeyRelatedField

class MySerializer(ModelSerializer):

    def to_internal_value(self, data):
        data = data.copy() # incase request data is immutable
        data['user'] = data['user_id']
        return super().to_internal_value(data)

    user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())

    class Meta:
        model = Model1
        fields = '__all__'

这应该允许有效载荷:

 {"user_id": 1, "other_fields": "details"}
于 2018-09-04T14:21:46.987 回答