【问题标题】:Django subquery outerref('id') You might need to add explicit type castsDjango subquery outerref('id') 您可能需要添加显式类型转换
【发布时间】:2020-06-16 08:18:08
【问题描述】:

我正在使用 postgresql。 我在子查询中编写子查询我想在父表的id 上应用过滤器和子表的字段。但它显示错误

查询: orders = Order.objects.filter(user=request.user, status='P') albums = models.Album.objects.annotate(purchased_status=Subquery(orders.values('id').filter(item_id=OuterRef('id'))[:1]))

错误 django.db.utils.ProgrammingError: operator does not exist: character varying = integer LINE 1: ...atus" = 'P' AND U0."user_id" = 1 AND U0."item_id" = "bookcen... HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

如果我在除 id 之外的任何字段上应用过滤器,它就可以正常工作。如果我将父表的id 添加为子表中的foreign key 但不想这样做,则此错误修复。

如果因为 OuterRef('id') 返回引用 id 而不是像 12 这样的整数值,则会出现问题 OuterRef('id') 有什么方法可以返回 id 的整数值。

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    docs 阅读:

    当子查询中的查询集需要引用字段时使用 OuterRef 来自外部查询。

    relevant example:

    newest = Comment.objects.filter(post=OuterRef('pk')).order_by('-created_at')
    Post.objects.annotate(newest_commenter_email=Subquery(newest.values('email')[:1]))
    

    模型 Comment 具有模型 Post 的 ForeignKey,newest 收集与每个 Post 关联的所有 Comments,并将它们从最新到最旧排序。

    Subquery 中选择email 列,并将第一行提取到查询中每个Post 的属性newest_commenter

    因此,在您的示例中,假设 Order 具有指向 Album 的外键,您可以执行以下操作:

    orders = Order.objects.filter(album=OuterRef('pk'), user=request.user, status='P')
    models.Album.objects.annotate(purchased_status=Subquery(orders.values('id')[:1]))
    

    这样对于每个Album,您将收到一个属性purchased_status,如果当前用户至少创建了一个状态为POrder,则该属性将包含第一个Orderid

    【讨论】:

    • 是的,我明白通过添加foreignKey它可以工作。但我想问有没有什么方法可以在不添加foreignKey的情况下工作?
    猜你喜欢
    • 2019-05-27
    • 2017-06-28
    • 2015-04-07
    • 2013-09-09
    • 2017-07-16
    • 2018-11-08
    • 1970-01-01
    • 2017-08-31
    • 2021-05-13
    相关资源
    最近更新 更多