如何在 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 等功能

如何在保护子句中使用“in”运算符?

uuid 创建中按位运算符的替代方案

如何在 Linq 的 Where 条件中使用 IN 运算符

如何在 SQL (JPA) 中使用带有 IN 运算符的嵌套 SELECT 语句?

如何在 Python 中生成可重现(带有种子)的随机 UUID