如何在 uuid 中使用 IN 运算符 - Django?
Posted
技术标签:
【中文标题】如何在 uuid 中使用 IN 运算符 - Django?【英文标题】:How to use the IN operator with uuid - Django? 【发布时间】:2019-08-11 23:54:43 【问题描述】:型号
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: ...客户端”开启(“app_subscriptions”。“client_id”=“客户... ^ 提示:没有运算符匹配给定的名称和参数类型。你可能 需要添加显式类型转换。
【问题讨论】:
如果有任何错误,请分享。 【参考方案1】:尝试将其转换为列表:
clients_list = list(Client.objects.filter(nome__icontains=q).values_list('pk', flat=True))
subscriptions = subscription.objects.filter(client__id__in=clients_list)
【讨论】:
client的字段名cliente是哪个 尝试:subscription.objects.filter(client__id__in=clients_list)【参考方案2】:首先,您的模型不包含 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)
【讨论】:
clients = list(clients) 不起作用。是的,名字 上面的Client
模型中似乎没有nome
字段。【参考方案3】:
这里没有理由使用两个查询,甚至是一个子查询。您需要一个简单的相关查找。
subscriptions = Subscription.objects.filter(client__nome__icontains=q)
但请注意,正如其他人指出的那样,您的实际错误可能是因为您的 Client 模型似乎不包含 nome
字段。
【讨论】:
没有如何?你看见什么了?如果该字段存在,请编辑您的问题 以显示它。请确保您发布实际代码;如果模型的那部分不准确,可能还有其他错误会改变答案。 你用的是什么数据库? Postgres。选择 "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 '\'【参考方案4】: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)
【讨论】:
以上是关于如何在 uuid 中使用 IN 运算符 - Django?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 API 网关中为请求/响应映射添加速度模板中生成随机 UUID 等功能