繁体   English   中英

Django Rest框架,如何使用foreignkey_id字段包含“ __all__”字段和相关字段

[英]Django Rest framework, how to include '__all__' fields and a related field using foreignkey_id field

这是我的文件-Models.py

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

Serializers.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__'

但这对我没有用。

我假设您正在使用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']viewset类的actions ,它们分别表示HTTP POSTHTTP PUTHTTP PATCH

尝试使用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"}

尝试这个:

class MySerializer(ModelSerializer):
    user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source='user', write_only=True)
    class Meta:
        model = Model1
        fields = '__all__'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM