У меня довольно простая проблема, но я нашел несколько решений и не мог не задаться вопросом, каким будет предполагаемый подход DRF.
У меня есть (упрощенная) модель и сериализатор, подобные этому:
class CartProduct(models.Model):
cart = models.ForeignKey('Cart', on_delete=models.CASCADE)
product = models.ForeignKey('Product', on_delete=models.CASCADE)
class CartProductSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField()
product = ProductSerializer()
class Meta:
model = CartProduct
fields = ('id', 'url', 'product')
, который выдает ответ GET, подобный следующему:
"url": "http://localhost:8000/appUsers/1/cart/products/16/",
"id": 16,
"product": {
"url": "http://localhost:8000/products/1/",
"id": 1,
"name": "Tomatoes",
},
"cart": "http://localhost:8000/carts/1/"
Однако при создании нового CartProduct сейчас в этом сценарии по умолчанию мне нужно будет передать словарь вложенных продуктов, такой каквыше, чтобы создать / десериализовать новый CartProduct из запроса POST.
Вместо этого я хотел бы отправить запрос POST с телом, используя только первичные ключи или URL-адреса для создания нового продукта корзины, например, так:
"product": 1,
"cart": 1
или
"product": "http://localhost:8000/products/1/"
"cart": "http://localhost:8000/carts/1/"
Так что теперь мне стало интересно, как лучше всего это сделать?Я подумал:
- Написание двух отдельных сериализаторов (но мне не нравится идея иметь два сериализатора для почти каждой модели, подобной этой)
- Добавление дополнительных полей в каждый сериализаторубедившись, что вложенные / связанные модели всегда представлены в виде url и / или id, и только обязательные поля этих идентификаторов обязательны
- Переопределение функции проверки / создания, чтобы сделать требуемый ввод действительным форматом
- Переопределение функций создания ModelViewSet и решение проблемы там
Что было бы наиболее подходящим местом для работы в таком случае?