Django Rest Framework: get_queryset возвращает 'detail': 'Not found' - PullRequest
0 голосов
/ 21 июня 2020

Привет, у меня есть API, которому необходимо выполнить соединение таблицы с подзапросом и вернуть набор запросов. Когда я печатаю набор запросов, он печатает набор запросов с одним объектом в нем, но возвращает ошибку 404 «деталь»: «Не найден».

Я получаю идентификатор клиента в URL-адресе, мне нужно запросить таблицу клиентов, чтобы получить соответствующий address_id и отправьте информацию об адресе address_id из таблицы адресов.

Ниже представлены модели

class Customer(models.Model):
    customer_id = models.AutoField(primary_key = True, auto_created = True)
    first_name = models.CharField(max_length = 45)
    last_name = models.CharField(max_length = 45)
    address_id = models.ForeignKey('Address', db_column = 'address_id', on_delete = models.CASCADE)

class Address(models.Model):
   address_id = models.AutoField(primary_key = True)
   district = models.CharField(max_length = 20 )
   postal_code = models.CharField(max_length = 10 , blank=True)
   phone = models.CharField(max_length = 20)

Ниже представлен вид

class AddressDetail(generics.RetrieveUpdateDestroyAPIView):

    lookup_url_kwarg = "customer_id"
    serializer_class = AddressSerializer
    
    def get_queryset(self):
        
        cust_id = self.kwargs['customer_id']
        
        customer_addr_id = Customer.objects.filter(customer_id = cust_id)
        return Address.objects.filter(address_id__in=customer_addr_id.values('address_id'))
        

Ниже url

path('<int:customer_id>/address',views.AddressDetail.as_view())

Я мог распечатать и увидеть объект в наборе запросов, но получил ответ «Не найден» на стороне клиента. Пожалуйста, дайте мне знать, если я что-то упускаю.

1 Ответ

0 голосов
/ 21 июня 2020

QuerySet.values() возвращает dict-подобный объект со всеми ключами, установленными на строку 'address_id' и значениями в значение 'address_id', для проверки существования адреса вы можете вместо этого использовать values_list.

# also you can chain `.distinct()` in the end
Address.objects.filter(address_id__in=customer_addr_id.values_list('address_id', flat=True))
...