Как получить данные из поля запроса django rest framework - PullRequest
0 голосов
/ 23 марта 2019

У меня есть 2 модели: Принтер и Чек

models.py

class Printer(models.Model):
    name        = models.CharField(...)
    api_key     = models.CharField(...)
    check_type  = models.CharField(...)                                    
    point_id    = models.IntegerField()

class Check(models.Model):
    printer_id      = models.ForeignKey(Printer, on_delete=models.CASCADE)
    type            = models.CharField(...)
    order           = JSONField(...)
    status          = models.CharField(...)
    pdf_file        = models.FileField(...)

Я создаю API с использованием Django REST Framework.И я получаю POST-запрос, который должен выглядеть следующим образом:

request "/ create_checks /"

{
  "id": 123456,
  "price": 780,
  "items": [
    {
      "name": "pizza",
      "quantity": 2,
      "unit_price": 250
    },
    {
      "name": "rolls",
      "quantity": 1,
      "unit_price": 280
    }
  ],
  "address": "some address",
  "client": {
    "name": "John",
    "phone": his phone
  },
  "point_id": 1
}

Каждая точка (место, где готовится еда) имеет два принтера.Мне нужно создать два Check объекта, чтобы один «чек» печатал для кухни, а другой для клиента.Для этого я собираюсь использовать «point_id» из запроса и создать две проверки

views.py

@api_view(['POST'])
def create_checks(request):
    queryset = Check.objects.all()
    orderid = #order_id from request
    point = #point_id from request
    jsonorder = #request body converted to json
    printers = Printer.objects.filter(point_id=point)
    kitchencheck = Check(printer_id=Printer.objects.get(name=printers[0].name), 
                        type="kitchen", order=jsonorder,status="new")
    clientcheck = Check(printer_id=Printer.objects.get(name=printers[1].name), 
                        type="client", order=jsonorder,status="new")
    kitchencheck.save()
    clientcheck.save()
    return Response({"Success": "Checks created successfully"}, status=status.HTTP_200_OK)

1.Как получить order_id и point_id из запроса?
2. Как преобразовать тело запроса в файл JSON?
3. Есть ли более простой способ сделать это?Я потратил целый день, пытаясь понять DRF, и «результат» выглядит слишком громоздким и нереальным

1 Ответ

1 голос
/ 23 марта 2019

Для этого предназначены сериализаторы.(https://www.django -rest-framework.org / api-guide / serializers / ) На уровне просмотра передайте запрос через сериализатор, который даст вам validated_data полезную нагрузку.Это, в свою очередь, вы можете использовать для создания экземпляров модели.Просто повторите последний шаг дважды, если вам нужно создать две модели из одного набора данных.

class CheckSerializer(serializers.Serializer):
    id = serializers.CharField()
    point_id = serializers.CharField()
    # etc ..

@api_view(['POST'])
def create_checks(request):
    queryset = Check.objects.all()

    serializer = CheckSerializer(data=request.data,
                                context={'request': request})
    serializer.is_valid(raise_exception=True)

    printers = Printer.objects.filter(point_id=serializer.validated_data['point_id'])

    kitchencheck = Check(
        printer_id=Printer.objects.get(name=printers[0].name), 
        type="kitchen",
        order=jsonorder,
        status="new"
        )

    clientcheck = Check(
        printer_id=Printer.objects.get(name=printers[1].name), 
        type="client",
        order=jsonorder,
        status="new"
        )

    kitchencheck.save()
    clientcheck.save()
    return Response({"Success": "Checks created successfully"}, status=status.HTTP_200_OK)
...