Чтение и создание вложенных отношений в одном сериализаторе django - PullRequest
0 голосов
/ 10 июля 2019

У меня есть две модели Category и Products, и одна классическая связь между ними.Каждый товар относится к категории.

Я использую Django-Rest-Framework.

Я использую ModelViewSet в качестве ViewSet и ModelSerializer в качестве сериализатора.

Я создал ProductViewSet, который имеет все функции CRUD.

Я пытаюсь включить отношение в операции READ (list, retrieve).Ответ должен выглядеть примерно так.

{
  "id" : 2,
  "name" : "foo product" , 
   "category" : {
     "id" : 4, 
     "name" : "foo relation" 
  }
}

Таким образом, я устанавливаю поле глубины в Meta равным 1.

class ProductSerializer(ModelSerializer):

    class Meta:
        model = Product
        exclude = ('createdAt',)
        depth = 1

Что делает категорию доступной только для чтения. Но я хочу, чтобы она была доступна для записи в других действиях (POST, ПОЛОЖИЛ).

Я знаю, что могу решить эту проблему с помощью двух сериализаций, но это повторяющаяся проблема, и я не хочу писать две сериализации для каждой имеющейся у меня модели.

Я попытался добавить поле category_id в сериализаторе, но мне пришлось переопределить метод create, чтобы он работал правильно.И снова я пытаюсь написать меньше кода.потому что я бы в конечном итоге переопределил все сериализаторы приложений.

class ProductSerializer(ModelSerializer):

    category_id = PrimaryKeyRelatedField(queryset=Category.objects.all())

    class Meta:
        model = Product
        exclude = ('createdAt',)
        depth = 1

    def create(self, validated_data):
        category_id = validated_data.pop('category_id').id
        validated_data['category_id'] = category_id
        return super().create(validated_data)

Это мой первый Django-фреймворк, и я стараюсь сделать его максимально аккуратным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...