2016-02-17 3 views
0
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Плохо сформированная шестнадцатеричная ошибка строки uuid в приспособлении Django; UUID JSON преобразование не Issue

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. Там нет ничего на Ф.К., чтобы предложить это, или должно быть ограничено, СИМВОЛОВ, Ints, 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, как это было вчера, но из строки /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

Указывается несколько раз здесь, что Джанго «UUIDField генерирует UUID, в Python». Теперь вот история. Я создал одну строку, один экземпляр модели A в Django с приспособлением, в котором не было uuid и нет поля даты и не было проблем. (Uuidfield находится в абстрактной модели, поэтому создается при создании объекта). Я сделал это, потому что мне нужен был uuid этого экземпляра модели A для поля fk в модели B, с которым я сейчас борюсь. Я сделал это, скопировав вставку Model A uuid в поле fk на модели B в файле csv, который затем преобразовал в json, чтобы использовать его в качестве инструмента.

  1. Возможно ли, что uuid столкнулся с проблемами в этом маневра для копирования пасты, прежде чем перейти к json?
  2. Если нет, это означает, что хотя это был приемлемый объект Python, когда он был создан, переход через json-преобразование испортил его, правильно?
  3. Если это так, то какое обходное решение?
  4. Может ли код Артура Пембертона работать в другом месте в этом процессе?
  5. Если я уйду от uuid, я, вероятно, смогу выполнить эту работу, но тогда мне нужно вернуться и поместить все fk uuid вручную. Есть ли лучшее решение? Может быть, основная вставка этого поля?
  6. Это может быть повторяющаяся проблема для меня, потому что я также использую Scrapy, которая поддерживает, но не требует json. Ни один из моих scraped элементов не будет отправлен с uuid, но как я могу автоматизировать добавление их fk в мой процесс, чтобы получить их в Django?
  7. Или все это является хорошей причиной для того, чтобы забыть uuids вообще?

Спасибо.

EDIT/UPDATE в @rolf:

Поскольку я только что обнаружил, что Джанго оболочка отличается больше, чем я понял (оболочка может найти настройки, регулярный интерпретатор не может) я решил запустить этот раз в каждом, но результаты были одинаковыми.

(cannon)[email protected]:~/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 

Теперь, когда я писал это, я заметил, что даже переполнение стека обрабатывает эти UUID по-разному, то есть, как они окрашены, если это отношение и смысл здесь.

Но теперь, когда мы это знаем, что мы делаем с этим?

второе обновление

Сегодня утром я подумала, что о 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 не определена ошибка, вместо «строкового типа» или какой-то такой ошибки, вне меня.

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, ошибка Django или и то, и другое?

+0

Что происходит, когда вы копировать/вставить значение вручную в интерпретаторе? Как это: В работе [11]: uuid.UUID ('0c7d3f47-5001-4e3f-8b85-4aba9456fb09') Out [11]: UUID ('0c7d3f47-5001-4e3f-8b85-4aba9456fb09') Подтвердили ли вы фактическое значение, когда оно ломается? – Rolf

ответ

2

Ваш синтаксис является неправильным:

uuid.UUID('61877565-5fe5-4175-9f2b-d24704df0b74') # note the quotes 
Смежные вопросы