Django fixture中错误形成的十六进制uuid字符串错误; json uuid转换失败问题

时间:2016-02-17 17:32:17

标签: json django scrapy uuid django-fixtures

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字段上都没有最大长度,也没有在fk链接上返回到uuid。 fk上没有任何内容表明它是或者应该仅限于字符,字符,uuids等。

然后我发现了这个: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,就像昨天一样,而是来自/usr/lib/python2.7/uuid.py,第134行,在 init 。该代码的相关部分是:

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和#34;中生成了UUID,这里有几次说明。现在这里有一些历史。我创建了一行,模型A的单个实例进入Django,其中一个没有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. 或者这一切都是完全忘记uuids的好理由吗?
  8. 感谢。

    每个@rolf

    编辑/更新

    因为我刚发现django shell比我意识到的更多(shell可以找到设置,常规解释器不能)我决定在每一个中运行一次,但结果是一样的。< / p>

    (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之外从未有过的任何地方怎么样?所以这就是我所做的:

    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错误,而不是&#39;字符串类型&#39;或者一些这样的错误超出了我的范围。

    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生成uuids的方式有问题,或者 2.它在我的系统上生成它们的方式,(Ubuntu 15.10,Django 1.9.1,Python 2.7.10)或 3.当它们返回时它读取和评估它们的方式,例如在uuid.UUID()中或在内部自动uuid生成过程之外输入。

    但这也意味着使用uuid.UUID()来生成uuids的人永远不会知道存在问题,除非他们做我做的事情,这是试图从外部引入它们。我记得在某个地方读过所有的uuids应该是兼容的。所以,除非这里的某个人有更好的洞察力,否则我认为我们可能会收到错误报告。但它是Python bug,Django bug还是两者兼而有之?

1 个答案:

答案 0 :(得分:2)

您的语法错误:

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