Как решить JSONDecodeError в / api / customer / order / add / Ожидаемое имя свойства в двойных кавычках: строка 1, столбец 30 (символ 29) - PullRequest
0 голосов
/ 03 ноября 2019

JSONDecodeError в / api / customer / order / add / Ожидаемое имя свойства, заключенное в двойные кавычки: строка 1, столбец 30 (символ 29) Метод запроса: URL запроса POST: http://localhost:8000/api/customer/order/add/?= Версия Django: 2.2.6 ИсключениеТип: JSONDecodeError Значение исключения:
Ожидаемое имя свойства, заключенное в двойные кавычки: строка 1, столбец 30 (символ 29) Расположение исключения: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/decoder.py в raw_decode, строка 353 Исполняемый файл Python: / Users / sandip / Desktop / myvirtualenv / foodtasker / bin / python Версия Python: 3.7.3

ВЫБРАТЬ APAIS

import json

from django.utils import timezone
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from oauth2_provider.models import AccessToken

from foodtaskerapp.models import Restaurant, Meal, Order, OrderDetails
from foodtaskerapp.serializers import RestaurantSerializer, MealSerializer

def customer_get_restaurants(request):
    restaurants = RestaurantSerializer(
        Restaurant.objects.all().order_by("-id"),
        many = True,
        context = {"request": request}
    ).data

    return JsonResponse({"restaurants": restaurants})

def customer_get_meals(request, restaurant_id):
    meals = MealSerializer(
        Meal.objects.filter(restaurant_id = restaurant_id).order_by("-id"),
        many = True,
        context = {"request": request}
    ).data

    return JsonResponse({"meals": meals})

@csrf_exempt
def customer_add_order(request):
    """
        params:
            access_token
            restaurant_id
            address
            order_details (json format), example:
                [{"meal_id": 1, "quantity": 2},{"meal_id": 2, "quantity": 3}]
            stripe_token

        return:
            {"status": "success"}
    """

    if request.method == "POST":
        # Get token
        access_token = AccessToken.objects.get(token = request.POST.get("access_token"),
            expires__gt = timezone.now())

        # Get profile
        customer = access_token.user.customer

        # Check whether customer has any order that is not delivered
        if Order.objects.filter(customer = customer).exclude(status = Order.DELIVERED):
            return JsonResponse({"status": "failed", "error": "Your last order must be completed."})

        # Check Address
        if not request.POST["address"]:
            return JsonResponse({"status": "failed", "error": "Address is required."})

        # Get Order Details
        order_details = json.loads(request.POST["order_details"])

        order_total = 0
        for meal in order_details:
            order_total += Meal.objects.get(id = order_details["meal_id"]).price * meal["quantity"]
            # order_total += Meal.objects.get(id = meal["meal_id"]).price * meal["quantity"]

        if len(order_details) > 0:
            # Step 1 - Create an Order
            order = Order.objects.create(
                customer = customer,
                restaurant_id = request.POST["restaurant_id"],
                total = order_total,
                status = Order.COOKING,
                address = request.POST["address"]
            )

            # Step 2 - Create Order details
            # for meal in order_details:
            #     OrderDetails.objects.create(
            #         order = order,
            #         meal_id = meal["meal_id"],
            #         quantity = meal["quantity"],
            #         sub_total = Meal.objects.get(id = meal["meal_id"]).price * meal["quantity"]
            #     )
            for meal in order_details:
                OrderDetails.objects.create(
                    order = order,
                    meal_id = order_details["meal_id"],
                    quantity = order_details["quantity"],
                    sub_total = Meal.objects.get(id = order_details["meal_id"]).price * meal["quantity"]
                )


            return JsonResponse({"status": "success"})

def customer_get_latest_order(request):
    return JsonResponse({})


from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

# Create your models here.
class Restaurant(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="restaurant")
    name = models.CharField(max_length=500)
    phone = models.CharField(max_length=500)
    address = models.CharField(max_length=500)
    logo = models.ImageField(upload_to="restaurant_logo/", blank=False)

    def __str__(self):
        return self.name

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="customer")
    avatar = models.CharField(max_length=500)
    phone = models.CharField(max_length=500, blank=True)
    address = models.CharField(max_length=500, blank=True)

    def __str__(self):
        return self.user.get_full_name()

class Driver(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="driver")
    avatar = models.CharField(max_length=500)
    phone = models.CharField(max_length=500, blank=True)
    address = models.CharField(max_length=500, blank=True)

    def __str__(self):
        return self.user.get_full_name()

class Meal(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    name = models.CharField(max_length=500)
    short_description = models.CharField(max_length=500)
    image = models.ImageField(upload_to="meal_images/", blank=False)
    price = models.IntegerField(default=0)

    def __str__(self):
        return self.name

class Order(models.Model):
    COOKING = 1
    READY = 2
    ONTHEWAY = 3
    DELIVERED = 4

    STATUS_CHOICES = (
        (COOKING, "Cooking"),
        (READY, "Ready"),
        (ONTHEWAY, "On the way"),
        (DELIVERED, "Delivered"),
    )

    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    driver = models.ForeignKey(Driver, on_delete=models.CASCADE, blank = True, null = True)
    address = models.CharField(max_length=500)
    total = models.IntegerField()
    status = models.IntegerField(choices = STATUS_CHOICES)
    created_at = models.DateTimeField(default = timezone.now)
    picked_at = models.DateTimeField(blank = True, null = True)

    def __str__(self):
        return str(self.id)

class OrderDetails(models.Model):
    order = models.ForeignKey(Order,on_delete=models.CASCADE, related_name="order_details")
    meal = models.ForeignKey(Meal, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    sub_total = models.IntegerField()

    def __str__(self):
        return str(self.id)

из импорта rest_frameworkсериализаторы

из foodtaskerapp.models import Ресторан, Еда

, класс RestaurantSerializer (serializers.ModelSerializer): logo = serializers.SerializerMethodField ()

def get_logo(self, restaurant):
    request = self.context.get("request")
    logo_url = restaurant.logo.url
    return request.build_absolute_uri(logo_url)
class Meta:
    model = Restaurant
    fields = ("id", "name", "phone", "address", "logo")

класс MealSerializer (сериализаторы. ModelSerializer): image = serializers.SerializerMethodField ()

def get_image(self, meal):
    request = self.context.get("request")
    image_url = meal.image.url
    return request.build_absolute_uri(image_url)

class Meta:
    model = Meal
    fields = ("id", "name", "short_description", "image", "price")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...