У меня есть две модели 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-фреймворк, и я стараюсь сделать его максимально аккуратным.