Используется ли сериализатор для отображения ввода или вывода DRF? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь понять сериализатор и то, как он работает, и передавать данные на веб-страницу, модель и вид. Насколько я понимаю, до сих пор сериализатор - это тот, кто обрабатывает и управляет потоком между моделью, представлением и взаимодействием пользователя с страницей. Это правильно?

Вот мой класс модели:

model.py

from django.db import models


# from django.contrib.auth.models import

class Meals(models.Model):
    print('MealModel')
    name = models.CharField(max_length=100)
    price = models.DecimalField(decimal_places=2, max_digits=5)

    def __str__(self):
        return "{} {}".format(self.name, self.price)


class Order(models.Model):
    print('Order Model')
    table_id = models.IntegerField()
    meal = models.ManyToManyField(Meals)

    def __str__(self):
        return "{} {}".format(self.table_id, self.meal.name)

view.py

from django.shortcuts import render
from rest_framework import viewsets

from cafe_app import serializers
from cafe_app import models


class MenuViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.MealSerializer
    queryset = models.Meals.objects.all()


class OrderViewSet(viewsets.ModelViewSet):
    print('OrderViewSet')
    serializer_class = serializers.OrderSerializer
    queryset = models.Order.objects.all()
    print(queryset)
    # queryset = []

serializer.py

from rest_framework import serializers

from cafe_app import models


class MealSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Meals
        fields = ['id', 'name', 'price', ]


class OrderSerializer(serializers.ModelSerializer):
    # meal = MealSerializer(many=True)
    **meal = serializers.StringRelatedField(many=True)**
    print(meal)
    print('OrderSerializer')

    class Meta:
        model = models.Order
        fields = ['table_id', 'meal', ]

    def create(self, validated_data):
        print(validated_data)
        meals = validated_data.pop('meal')
        print(meals)
        print(type(meals))
        t_id = models.Order.objects.filter(table_id=validated_data['table_id'])
        if len(t_id) == 0:
            instances = models.Order.objects.create(**validated_data)
            # instances.save()
        else:
            instances = models.Order.objects.get(table_id=validated_data['table_id'])
        # count =0
        print(instances)
        for meal in meals:
            print(meal)
            instances.meal.add(meal)
            # count += 1
        # instances.save()
        print(instances)
        # print(count)
        return instances

В настоящее время я получаю вывод в виде: enter image description here

Если я прокомментирую еды = serializers.StringRelatedField (many = True) из OrderSerializer, то я получаю вывод как:

enter image description here

Мой вопрос:

  1. Как отобразить значение даже для выбранных блюд, а также при отображении вывода цена еды и название вместо просто id. По сути, как я могу отображать оба вывода изображения одновременно?
  2. Как изменение одной строки так сильно влияет на то, является ли сериализатор как для чтения ввода, так и для вывода вывода?
  3. Почему модель заказа имеет нет значения, так как при проверке модели заказа она дает

    Order.objects.all ()

    QuerySet [Заказ: 3 Нет, Заказ: 1 Нет, Заказ: 2 Нет, Заказ: 4 Нет, Заказ: 6 Нет]

    Если набор запросов модели заказа для еды пуст, то откуда он отображает значение еды при выполнении набора запросов по заказу из orderserializer и orderviewset? и как я могу сохранить стоимость еды также в модели заказа.

Спасибо

...