Я запустил код для создания общих объектов из этой демонстрации:
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) также не помог, так как нет сигнатуры метода, и код выглядит очень универсальным. Следующим шагом будет отладка метода и попытка выяснить, что происходит, но это выглядит немного экстремально ...
Кажется, мне здесь не хватает фундаментального принципа работы ... что это? Как мне решить подобные проблемы самостоятельно в будущем?