#django #django-models #django-rest-framework
Вопрос:
У меня есть 2 модели с именами Рецепт и Шаг.. Я сериализовал оба, чтобы создать API для запроса GET.. Я хочу знать, есть ли способ создать запрос на публикацию, чтобы я мог отправлять данные (шаги и рецепт) в одном запросе?
models.py:
from django.db import models
class Recipe(models.Model):
title = models.CharField( max_length=50)
uuid = models.CharField( max_length=100)
def __str__(self):
return f'{self.uuid}'
class Step(models.Model):
step = models.CharField(max_length=300)
uuid = models.ForeignKey(Recipe, on_delete=models.CASCADE)
def __str__(self):
return f'{self.step} - {self.uuid}'
serializers.py:
from rest_framework import serializers
from .models import *
class RecipeSerializer(serializers.ModelSerializer):
class Meta:
model = Recipe
fields = ['title', 'uuid']
class StepSerializer(serializers.ModelSerializer):
class Meta:
model = Step
fields = ['step', 'uuid']
views.py:
from django.shortcuts import render
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .serializers import *
from .models import *
@api_view(['GET'])
def apiOverview(request):
api_urls = {
'List':'/recipe-list/',
'Detail View':'/recipe-detail/<str:pk>/',
'Create':'/recipe-create/',
'Update':'/recipe-update/<str:pk>/',
'Delete':'/recipe-delete/<str:pk>/',
'Steps' : '/steps/<str:pk>'
}
return Response(api_urls)
@api_view(['GET'])
def recipeList(request):
recipes = Recipe.objects.all()
serializer = RecipeSerializer(recipes, many=True)
return Response(serializer.data)
@api_view(['GET'])
def recipeDetail(request, pk):
recipe = Recipe.objects.get(uuid=pk)
recipe_serializer = RecipeSerializer(recipe, many=False)
steps = Step.objects.filter(uuid=pk)
steps_serializer = StepSerializer(steps, many=True)
return Response({
'recipe' : recipe_serializer.data,
'steps' : steps_serializer.data
})
Как я могу создать представление для публикации и обработать обе модели?
Комментарии:
1. Да, ты можешь. Просто поместите их в данные одного запроса и создайте сериализатор, который использует оба
RecipeSerializer
иStepSerializer
. Хотя является ли этот подход наилучшей практикой или нет, это еще одна дискуссия
Ответ №1:
Попробуй:
from rest_framework import generics
from .models import *
class StepAndRecipe(generics.CreateAPIView):
queryset = Step.objects.all()
queryset = Recipe.objects.all()
serializer_class = StepSerializer
serializer_class = RecipeSerializer
Добавить в urls.py:
from django.urls import path
from .views import StepAndRecipe
urlpatterns = [
path('steprecipepost', StepAndRecipe.as_view(), name='steps_recipes')
Это будет работать только с POST! И еще одно: будьте осторожны с необработанными данными и HTML-формой, возможно, тезисы немного запутаются, так как вы используете две модели в одном представлении.
Комментарии:
1. Возможно ли объединить их в один и тот же класс? Я не хочу делать 2 разных запроса на публикацию от react, чтобы публиковать данные отдельно..
2. Я хотел бы иметь и рецепт, и шаг в одном и том же представлении и URL-адрес для ПУБЛИКАЦИИ и ПОЛУЧЕНИЯ.. Надеюсь, я ясно выразился