Ошибка кортежа при использовании Queryset для сопоставления пользователя с указанным c внешним ключом к ключу - PullRequest
1 голос
/ 13 апреля 2020

Я пытаюсь создать API, который возвращает заказы, которые удовлетворяют следующим требованиям: Состояние = готово, никакой другой водитель не поднял его, и драйвер назначен этому месту. Водитель должен иметь возможность просматривать заказы только из назначенного им места. Каждый раз, когда я вызываю api, я получаю сообщение об ошибке: объект 'tuple' не вызывается.

Как правильно отформатировать и вернуть все элементы в запросе в JsonResponse? Я не понимаю ошибку.

Вот результат запроса

TypeError at /api/driver/orders/ready/
'tuple' object is not callable

 /apis.py in driver_get_ready_orders
@csrf_exempt
def driver_get_ready_orders(request):
    driver = CustomJWTAuthenticator().authenticate(request)[0].driver
    queryset = Order.objects.filter(
        status=Order.READY, driver=None).order_by("-id"),
    if driver.dispensary:
        queryset = queryset(dispensary=driver.dispensary ...
                            )
    orders = Order.objects.filter(
        queryset,
        many=True,
        context={"request": request}
▶ Local vars
Variable    Value
driver  
<Driver: Malcom Brooks>
queryset    
(<QuerySet [<Order: 10>, <Order: 8>]>,)
request 
<WSGIRequest: GET '/api/driver/orders/ready/?

Вот мой API:

   def driver_get_ready_orders(request):


    driver = CustomJWTAuthenticator().authenticate(request)[0].driver
    queryset = Order.objects.filter(
        status=Order.READY, driver=None).order_by("-id"),
    if driver.dispensary:
        queryset = queryset(dispensary=driver.dispensary
                                        ).all()
    orders = Order.objects.filter(
            queryset,
            many=True


    )

    return JsonResponse({"orders": orders.data})

Порядок и модель драйвера:

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

    CANCELED = 5

    STATUS_CHOICES = (
        (PICKING, "Your Order Is Being Picked Right Off The Plant!"),
        (READY, "Picked, Weighed, And Ready For Delivery."),
        (ONTHEWAY, "The Best Bud Is Heading Straight To Your Door."),
        (DELIVERED, "Delivered"),

        (CANCELED, "Canceled/Refunded")
    )
    address = models.CharField(max_length=500)

    customer = models.ForeignKey(CustomerDetails, on_delete=models.CASCADE)

    dispensary = models.ForeignKey(Dispensary, on_delete=models.CASCADE)
    driver = models.ForeignKey(
        Driver, blank=True, null=True, on_delete=models.CASCADE)

status = models.IntegerField(choices=STATUS_CHOICES)

def __str__(self):

    return str(self.id)

class Driver(models.Model):
    Active_License = (
        ('License_Status', (
            ('active', 'Active'),
            ('suspended', 'Suspended')
        )),
    )
    address = models.CharField(max_length=500, blank=True)


    name = models.CharField(max_length=500, default='')
    phone = models.CharField(max_length=500, blank=True)
    photo = models.ImageField(
        upload_to='driver_photos/', blank=False, default='')

    user = models.OneToOneField(
        User, on_delete=models.CASCADE, related_name='driver')
    dispensary = models.ForeignKey(
        Dispensary, null=True, blank=True, on_delete=models.CASCADE)


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

1 Ответ

2 голосов
/ 13 апреля 2020

Здесь есть три проблемы:

  1. вы использовали конечную запятую и таким образом обернули результат в одноэлементный кортеж;
  2. a queryset равно не вызывается, следовательно, queryset = queryset(dispensary=driver.dispensary) недействительно;
  3. вы также не можете фильтровать с помощью .filter(queryset). Вы, вероятно, здесь хотите использовать сериализатор :

Таким образом, вы должны переписать это на:

# no trailing comma
queryset = Order.objects.filter(status=Order.READY, driver=None).order_by('-id')
if driver.dispensary:
    queryset = queryset.filter(dispensary=driver.dispensary)
orders = <b>OrderSerializer(</b>queryset, many=True<b>)</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...