Как использовать оператор IN с uuid - Django? - PullRequest
0 голосов
/ 21 марта 2019

Как использовать оператор IN с uuid - Django?

Модель

class Client(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    nome    = models.CharField(max_length=255)
    email    = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.nome

class Subscription(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    vencimento = models.DateField()
    client = models.OneToOneField(Client, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Просмотр

 clients = Client.objects.filter(nome__icontains=q).values_list('pk', flat=True)
 subscriptions = Subscription.objects.filter(client_id__in=clients)

Я пытался использовать это для преобразования, и он все еще делаетне работает.

clients = [str(o) for o in clients]

Куда я иду не так?

Спасибо.

Я тоже пробовал это

subscriptions = Subscription.objects.filter(client__nome__icontains=q)

Запрос

SELECT "app_subscription"."id", "app_subscription"."vencimento","app_subscription"."client_id", "app_subscription"."created_at", "app_subscription"."updated_at" FROM "app_subscription" INNER JOIN "cad_client" ON ("app_subscription"."client_id" = "cad_client"."id") WHERE "cad_client"."nome" LIKE %marcelo% ESCAPE '\' 

ОШИБКА

psycopg2.ProgrammingError: оператор не существует: символ меняется = uuid

оператор не существует: символ меняется = uuid LINE 1: ...client "ON (" app_subscription "." client_id "=" clien ... ^ СОВЕТ: ни один оператор не соответствует данному имени и типу (аргументам) аргументов. Возможно, вам потребуется добавить явное приведение типов.

Ответы [ 4 ]

0 голосов
/ 21 марта 2019
class Subscription(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    vencimento = models.DateField()
    client = models.OneToOneField(Client, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

Этот столбец в базе данных не был типа uuid.Он был с Varchar.

Так что сравнивать было невозможно.

Просто измените тип столбца Varchar на uuid в базе данных.

Спасибо всем за вашевнимание.

client = models.OneToOneField(Client, on_delete=models.CASCADE)
0 голосов
/ 21 марта 2019

Во-первых, ваша модель не содержит nome поля. Итак, если это так, ваш запрос возвращает набор запросов. Итак, для работы IN необходимо передать список.

clients = Client.objects.filter(nome__icontains=q).values_list('pk', flat=True)
clients = list(clients)
subscriptions = Subscription.objects.filter(client_id__in=clients)
0 голосов
/ 21 марта 2019

Нет причин использовать два запроса или даже подзапрос. Вам нужен простой связанный поиск.

subscriptions = Subscription.objects.filter(client__nome__icontains=q)

Но учтите, что ваша настоящая ошибка, как указывали другие, возможно, связана с тем, что ваша модель клиента не содержит поля nome.

0 голосов
/ 21 марта 2019

Попробуйте преобразовать его в список:

clients_list = list(Client.objects.filter(nome__icontains=q).values_list('pk', flat=True))
subscriptions = subscription.objects.filter(client__id__in=clients_list)
...