get_or_create родовые отношения в Django и отладка python в целом - PullRequest
5 голосов
/ 15 апреля 2010

Я запустил код для создания общих объектов из этой демонстрации: http://www.djangoproject.com/documentation/models/generic_relations/

Все хорошо изначально:

>>> bacon.tags.create(tag="fatty")
<TaggedItem: fatty>
>>> tag, newtag = bacon.tags.get_or_create(tag="fatty")
>>> tag
<TaggedItem: fatty>
>>> newtag
False

Но тогда интересующий меня случай использования моего приложения:

>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome")
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py", line 123, in get_or_create
    return self.get_query_set().get_or_create(**kwargs)
  File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py", line 343, in get_or_create
    raise e
IntegrityError: app_taggeditem.content_type_id may not be NULL

Я попробовал несколько случайных вещей, посмотрев на другой код:

>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome", content_type=TaggedItem)
ValueError: Cannot assign "<class 'generics.app.models.TaggedItem'>": "TaggedItem.content_type" must be a "ContentType" instance.

или

>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome", content_type=TaggedItem.content_type)
InterfaceError: Error binding parameter 3 - probably unsupported type.

и т.д.

Я уверен, что кто-то может дать мне правильный синтаксис, но настоящая проблема здесь в том, что я понятия не имею, что происходит. Я разрабатывал языки со строгой типизацией более десяти лет (сборка x86, C ++ и C #), но я новичок в Python. Мне действительно трудно следить за тем, что происходит в Python, когда такие вещи ломаются.

На языках, которые я упоминал ранее, довольно просто выяснить подобные вещи - проверить сигнатуру метода и проверить ваши параметры. Просмотр документации Django в течение получаса оставил меня таким же потерянным. Просмотр источника для get_or_create (self, ** kwargs) также не помог, так как нет сигнатуры метода, и код выглядит очень универсальным. Следующим шагом будет отладка метода и попытка выяснить, что происходит, но это выглядит немного экстремально ...

Кажется, мне здесь не хватает фундаментального принципа работы ... что это? Как мне решить подобные проблемы самостоятельно в будущем?

Ответы [ 2 ]

9 голосов
/ 15 апреля 2010

ContentType.objects.get_for_model() даст вам соответствующий ContentType для модели. Передайте возвращенный объект как content_type.

И не беспокойтесь о том, чтобы "получить это", когда дело доходит до Джанго. Джанго в основном сумасшедший с самого начала, и приветствуется экспериментирование и интенсивное чтение как документации, так и источника.

2 голосов
/ 15 апреля 2010

Я собрал здесь несколько ссылок для отладки Django . Два лучших из группы - Пост Саймона Уиллисона (в частности, pdb может заставить вас чувствовать больше на Python, из C # / VisualStudio) и панели инструментов отладки Django .

...