Как разместить несколько данных в DRF и реагировать с помощью Axios

#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-адрес для ПУБЛИКАЦИИ и ПОЛУЧЕНИЯ.. Надеюсь, я ясно выразился