Django Rest Framework, как включить поля '__all__' и связанное поле, используя поле foreignkey_id - PullRequest
0 голосов
/ 04 сентября 2018

Так вот мои файлы - 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" для "пользователя" это работает для меня. Но я не могу изменить запрос JSON. Есть ли способ решить эту проблему в сериализаторе?

Я могу установить все поля вместо ' _all_ ', но это не очень хорошее решение из-за большого количества полей.

Я тоже пытался с -

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

но у меня это не сработало.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Я предполагаю, что вы используете viewset класс для ваших просмотров. тогда это будет работать

Переопределите метод __init__ как

class MySerializer(ModelSerializer):
    <b>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')</b>

    class Meta:
        model = Model1
        fields = '__all__'



['create', 'update', 'partial_update'] - это actions из viewset класса, которые представляют HTTP POST , HTTP PUT и HTTP PATCH соответственно.

0 голосов
/ 04 сентября 2018

попробуйте это:

class MySerializer(ModelSerializer):
    user_id = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), source='user', write_only=True)
    class Meta:
        model = Model1
        fields = '__all__'
0 голосов
/ 04 сентября 2018

Попробуйте использовать 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"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...