gpt4 book ai didi

django - 将 django RawQueryset 中字段的值转换为不同的 django 字段类型

转载 作者:行者123 更新时间:2023-12-02 02:54:41 27 4
gpt4 key购买 nike

我有一个相当复杂的查询,它生成了一个 Django RawQuerySet .此特定查询返回的某些字段不属于 RawQuerySet 的模型的一部分。基于,所以我使用 .annotate(field_name=models.Value('field_name'))将其作为属性附加到 RawQuerySet 中的各个记录.最重要的自定义字段实际上是一个 uuid ,我用它来使用 Django 的 {% url %} 组成 URL功能。

问题是:我没有使用标准 uuid在我的应用程序中,我正在使用 SmallUUIDs (压缩的 UUID。)它们作为 native uuidfield 存储在数据库中s 然后在 python 中转换为较短的字符串。所以我需要以某种方式转换 uuid作为 RawQuerySet 的一部分返回到 SmallUUID用于在模板中生成 URL。

我的代码看起来有点像这样:

query = "SELECT othertable.uuid_field as my_uuid FROM myapp_mymodel
JOIN othertable o ON myapp_mymodel.x = othertable.x"

MyModel.objects.annotate(
my_uuid=models.Value('my_uuid'),
).raw(query)

现在这里有一个合乎逻辑的解决方案, models.Value 有一个可选的 kwarg|叫 output_field ,使代码看起来像这样:
MyModel.objects.annotate(
my_uuid=models.Value('my_uuid', output_field=SmallUUIDField()),
).raw(query)

但它不起作用!该 kwarg 被完全忽略,属性的类型基于从数据库返回的类型,而不是 output_field 中的类型。 .就我而言,我收到了 uuid输出是因为 Postgres 返回的是 UUID 类型,但是如果我将查询更改为 SELECT cast othertable.uuid_field as text) as my_uuid我会以字符串的格式获取属性。在这种情况下,Django(至少版本 1.11.12)似乎并不真正关心该 kwarg 中的内容。

所以这就是我在想的是我的潜在解决方案,没有特别的顺序:
  • 以某种方式更改查询的格式(在 Django 或 SQL 中)
  • 在传递给 View 之前以某种方式更改生成的 RawQuerySet
  • 更改模板中的某些内容以将 UUID 转换为 smalluuid,以便在 URL 反向过程中使用。

  • 我接下来最好的步骤是什么?

    最佳答案

    您当前的方法有几个问题:

  • Value()没有做你认为的那样 - 你的注释实际上只是用值“my_uuid”注释每一行,因为这是你传递给它的。它不会查找该名称的字段(为此您需要使用 F 表达式)。
  • 无论如何,上面的第 1 点都无关紧要,因为只要您使用 raw()然后注释被忽略 - 这就是为什么你看不到它的影响。

  • 底线是试图注释 RawQuerySet不会很容易。有一个 translations它接受的论点,但我想不出一种方法来让它与您正在使用的连接类型一起工作。

    我能想到的下一个最好的建议是您只需手动将字段转换为 SmallUUID当你需要它时对象 - 像这样:
    from smalluuid import SmallUUID

    objects = MyModel.objects.raw(query)

    for o in objects:
    # Take the hex string obtained from the database and convert it to a SmallUUID object.
    # If your database has a built-in UUID type you will need to do
    # SmallUUID(small=o.my_uuid) instead.
    my_uuid = SmallUUID(hex=o.my_uuid)

    (我在循环中这样做只是为了说明 - 根据您需要的位置,您可以在模板标记或 View 中执行此操作)。

    关于django - 将 django RawQueryset 中字段的值转换为不同的 django 字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50122170/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com