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

问题描述 投票:0回答:4

如何使用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:运算符不存在:character varying = uuid

运算符不存在:字符变化= uuid LINE 1:... client“ON(”app_subscriptions“。”client_id“=”clien ... ^提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。

python django python-3.x postgresql django-orm
4个回答
0
投票

尝试将其转换为列表:

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

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)

0
投票

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

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

但请注意,正如其他人指出的那样,您的实际错误可能是因为您的客户端模型似乎不包含nome字段。


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)
© www.soinside.com 2019 - 2024. All rights reserved.