如何在uuid中使用IN运算符-Django?

时间:2019-03-21 06:51:21

标签: python django python-3.x postgresql django-orm

如何在uuid中使用IN运算符-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第1行:   ... client“ ON(” app_subscriptions“。” client_id“ =”客户端...                                                                ^提示:没有运算符匹配给定的名称和参数类型。你可能   需要添加显式类型强制转换。

4 个答案:

答案 0 :(得分:0)

尝试将其转换为列表:

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

答案 1 :(得分:0)

首先,您的模型不包含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)

答案 2 :(得分:0)

这里没有理由使用两个查询,甚至一个子查询。您需要一个简单的相关查询。

get

但是请注意,正如其他人指出的那样,您的实际错误可能是因为您的客户模型似乎不包含subscriptions = Subscription.objects.filter(client__nome__icontains=q) 字段。

答案 3 :(得分:0)

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)