如何在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“ =”客户端... ^提示:没有运算符匹配给定的名称和参数类型。你可能 需要添加显式类型强制转换。
答案 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)