如何使用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 ... ^提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。
尝试将其转换为列表:
clients_list = list(Client.objects.filter(nome__icontains=q).values_list('pk', flat=True))
subscriptions = subscription.objects.filter(client__id__in=clients_list)
首先,您的模型不包含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)
这里没有理由使用两个查询,甚至是子查询。您需要一个简单的相关查找。
subscriptions = Subscription.objects.filter(client__nome__icontains=q)
但请注意,正如其他人指出的那样,您的实际错误可能是因为您的客户端模型似乎不包含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)
数据库中的此列不是uuid类型。他和Varchar在一起。
所以无法进行比较。
只需在数据库中将Varchar列的类型更改为uuid即可。
谢谢大家的关注。
client = models.OneToOneField(Client, on_delete=models.CASCADE)