Я выполнил код для создания в общем связанных объектов из этой демонстрации: http://www.djangoproject.com/documentation/models/generic_relations/
Все хорошо первоначально:
>>> bacon.tags.create(tag="fatty")
>>> tag, newtag = bacon.tags.get_or_create(tag="fatty")
>>> tag
>>> newtag
False
Но затем вариант использования, что я интересуюсь для моего приложения:
>>> tag, newtag = bacon.tags.get_or_create(tag="wholesome")
Traceback (most recent call last):
File "", line 1, in
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 "": "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 (сам, ** kwargs) не помогло ни одному, так как нет никакой сигнатуры метода, и код кажется очень универсальным. Следующий шаг должен был бы отладить метод и попытку выяснить то, что происходит, но это кажется небольшим экстремальным значением...
Я, кажется, пропускаю некоторый фундаментальный операционный принцип здесь... что это? Как я решаю вопросы как это самостоятельно в будущем?
ContentType.objects.get_for_model ()
предоставит вам соответствующий ContentType
для модели. Передайте возвращенный объект как content_type
.
И не стоит слишком беспокоиться о том, чтобы «получить это», когда дело касается Django. Django в основном безумен, поэтому рекомендуется экспериментировать и внимательно читать как документацию, так и исходный код.
Я собрал здесь несколько ссылок для отладки Django . Двумя лучшими в группе являются сообщение Саймона Уиллисона (в частности, pdb может помочь вам почувствовать себя в Python как дома) и Панель инструментов отладки Django .