【问题标题】:Badly Formed hexadecimal uuid string error in Django fixture; json uuid conversion fails issueDjango 夹具中格式错误的十六进制 uuid 字符串错误; json uuid 转换失败问题
【发布时间】:2016-05-29 13:42:24
【问题描述】:
File "/home/malikarumi/Projects/cannon/local/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 2390, in get_db_prep_value
value = uuid.UUID(value)
File "/usr/lib/python2.7/uuid.py", line 134, in __init__
raise ValueError('badly formed hexadecimal UUID string')
ValueError: Problem installing fixture '/home/malikarumi/Projects/cannon/jamf/essell/fixtures/test22byhand.json': badly formed hexadecimal UUID string

到目前为止,我找到了以下链接:
https://github.com/dcramer/django-uuidfield/issues/40

https://github.com/dcramer/django-uuidfield/commit/caae1bc4e45445a06dd11bb22da6a9f07395f78a

Django UUIDField modelfield causes error in Django admin: badly formed hexadecimal UUID string

Django Primary Key: badly formed hexadecimal UUID string

我计算了我的 uuidfield 值。它是 len=36,因为它有破折号。至少我能看到的字符串表示是这样的。所以我用相同的不带破折号的字母数字替换它,正如错误修复所建议的测试,但我仍然得到相同的结果。

我检查了模型,但在任​​何 uuid 字段上都没有最大长度,在返回 uuid 的 fk 链接上也没有。 fk 上没有任何内容表明它是或应该仅限于字符、整数、uuid 等。

然后我发现了这个:http://arthurpemberton.com/2015/04/fixing-uuid-is-not-json-serializable,我侵入了 /python2.7/site-packages/django/core/serializers/python.py。博主已将其放入 models.py 中。但是我得到了同样的错误,在我意识到它不是像昨天那样来自 serializers/python.py 之前,而是来自 init 中的 /usr/lib/python2.7/uuid.py 的第 134 行强>。该代码的相关部分是:

if hex is not None:
        hex = hex.replace('urn:', '').replace('uuid:', '')
        hex = hex.strip('{}').replace('-', '')
        if len(hex) != 32:
            raise ValueError('badly formed hexadecimal UUID string')
        int = long(hex, 16)

考虑到问题是 json 而不是 Python,我没有尝试破解更多核心代码,所以我暂时搁置了这个问题。

最后,我看了这个:

https://code.djangoproject.com/ticket/24012

这里多次提到 Django 的“UUIDField 在 Python 中生成 UUID”。现在这里有一些历史。我在 Django 中创建了一行模型 A 的单个实例,其夹具没有 uuid 和日期字段且没有问题。 (uuidfield 是在一个抽象模型上,所以它是在创建对象时创建的)。我这样做是因为我需要模型 B 中的 fk 字段的模型 A 实例的 uuid,这是我现在正在努力解决的问题。我通过将模型 A uuid 复制粘贴到 csv 文件中模型 B 上的 fk 字段中来做到这一点,然后我将其转换为 json 以便将其用作夹具。

  1. 在转换为 json 之前,uuid 是否可能在此复制粘贴操作中遇到问题?
  2. 如果不是,这意味着即使它在创建时是可接受的 Python 对象,但通过 json 转换会搞砸,对吗?
  3. 如果是这种情况,有什么解决方法?
  4. 可以使 Arthur Pemberton 代码在此过程中的其他地方工作吗?
  5. 如果我关闭 uuid,我可能可以完成这项工作,但是我必须返回并手动放入所有 fk uuid。有更好的解决方案吗?也许仅该字段的批量插入?
  6. 这对我来说可能是一个反复出现的问题,因为我也在使用 Scrapy,它支持但不需要 json。我抓取的所有项目都不会附带 uuid,但是如何自动将它们的 fk 添加到我的进程中以便将它们放入 Django?
  7. 或者所有这些都是完全忘记 uuid 的好理由?

谢谢。

编辑/更新每个@rolf:

由于我刚刚发现 django shell 的不同之处比我想象的要大(shell 可以找到设置,而常规解释器却找不到),所以我决定每次运行一次,但结果是一样的。

(cannon)malikarumi@Tetuoan2:~/Projects/cannon/jamf$ python manage.py shell
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 


IPython 4.0.3 -- An enhanced Interactive Python.

In [1]: uuid.UUID(a82857b6-e336-4c6c-8499-47601770b39d)
File "<ipython-input-1-e282858da374>", line 1
uuid.UUID(a82857b6-e336-4c6c-8499-47601770b39d)
                           ^
SyntaxError: invalid syntax


In [2]: uuid.UUID(a0a69415-6627-43db-8c7a-b57d0c4cefe2)
File "<ipython-input-2-befebf1573ba>", line 1
uuid.UUID(a0a69415-6627-43db-8c7a-b57d0c4cefe2)
                           ^
SyntaxError: invalid syntax


In [3]: uuid.UUID(e6e11b06-ea3b-4e98-a31f-9a83447ad884)
File "<ipython-input-3-a59ea095e61a>", line 1
uuid.UUID(e6e11b06-ea3b-4e98-a31f-9a83447ad884)
                                             ^
SyntaxError: invalid syntax


In [4]: uuid.UUID(bd116432-65d7-4612-abfe-9a99dcaf5cad)
File "<ipython-input-4-c4a04434aa3c>", line 1
uuid.UUID(bd116432-65d7-4612-abfe-9a99dcaf5cad)
                      ^
SyntaxError: invalid syntax

现在我已经发布了这篇文章,我注意到即使 Stack Overflow 也会以不同的方式处理这些 uuid,即它们的颜色方式,如果这在此处相关且有意义的话。

但既然我们知道了这一点,我们该怎么处理/处理它?

第二次更新

今天早上我想,除了 Django 之外从未出现过的 uuid 呢?所以这就是我所做的:

In [5]: e.uuid
Out[5]: UUID('61877565-5fe5-4175-9f2b-d24704df0b74')

In [6]: uuid.UUID(61877565-5fe5-4175-9f2b-d24704df0b74)
  File "<ipython-input-6-56137f5f4eb6>", line 1
    uuid.UUID(61877565-5fe5-4175-9f2b-d24704df0b74)
                          ^
SyntaxError: invalid syntax


In [7]: uuid.UUID('61877565-5fe5-4175-9f2b-d24704df0b74')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-3b4d3e5bd156> in <module>()
----> 1 uuid.UUID('61877565-5fe5-4175-9f2b-d24704df0b74')

NameError: name 'uuid' is not defined

这显然是因为我在字母数字周围留下了引号,但为什么会产生一个未定义的 uuid 错误,而不是“字符串类型”或一些这样的错误是我无法理解的。

In [8]: uuid.UUID(61877565-5fe5-4175-9f2b-d24704df0b74)
  File "<ipython-input-8-56137f5f4eb6>", line 1
    uuid.UUID(61877565-5fe5-4175-9f2b-d24704df0b74)
                          ^
SyntaxError: invalid syntax 

我第一次用手键入字符。我决定通过复制和粘贴来重复测试,但正如你所看到的,它没有任何区别。如果只有插入符号指向的 5 的生成方式有什么奇怪的地方,我们可能会做一些事情,但如果是这样,为什么我自己手动输入时会在同一个地方得到同样的错误?

这对我来说似乎不再是一个 json 问题,因为据我所知,json 从未接触过这个 uuid,除非它以某种方式在 Django 的内部工作中发生。 相反,有 1. uuid.UUID生成uuid的方式有问题,或者 2. 它在我的系统上生成它们的方式,(Ubuntu 15.10、Django 1.9.1、Python 2.7.10)或 3. 当它们返回时读取和评估它们的方式,例如在 uuid.UUID() 中或在内部自动 uuid 生成过程之外输入。

但这也意味着使用 uuid.UUID() 生成 uuid 的人永远不会知道存在问题,除非他们按照我的做法进行操作,即尝试从外部引入。我记得在某处读到所有 uuid 都应该兼容。所以,除非这里有人有更好的洞察力,否则我认为我们可能会收到错误报告。但它是 Python 错误、Django 错误,还是两者兼而有之?

【问题讨论】:

  • 在解释器中手动复制/粘贴值会发生什么?像这样: In [11]: uuid.UUID('0c7d3f47-5001-4e3f-8b85-4aba9456fb09') Out[11]: UUID('0c7d3f47-5001-4e3f-8b85-4aba9456fb09') 你验证过实际值吗?它坏了吗?

标签: json django scrapy uuid django-fixtures


【解决方案1】:

你的语法错误:

uuid.UUID('61877565-5fe5-4175-9f2b-d24704df0b74') # note the quotes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 2023-01-28
    • 2015-12-03
    相关资源
    最近更新 更多