У меня есть модель с родовым отношением (назовите его A), при создании экземпляра этого объекта я передаю экземпляр другой модели (назовем его B) в качестве инициализатора поля content_object (через kwargs конструктора) .
Если я не сохраняю B до создания A, то при сохранении A content_object_id сохраняется в БД как NULL. Если я сохраню B , прежде чем передать его конструктору A , тогда все в порядке.
Это не логично. Я предположил, что идентификатор связанного объекта (B) выбирается при выполнении A.save (), и он должен выдавать какое-то исключение, если B еще не сохранен, но просто молча завершается сбоем. Мне не нравится текущее решение (сохраняя B заранее), потому что мы еще не знаем, всегда ли я буду сохранять объект, а не просто удалять его, и есть соображения производительности - что если я добавлю некоторые другие данные и сохраните его еще раз вскоре после этого.
class BaseNodeData(models.Model):
...
extnodedata_content_type = models.ForeignKey(ContentType, null=True)
extnodedata_object_id = models.PositiveIntegerField(null=True)
extnodedata = generic.GenericForeignKey(ct_field='extnodedata_content_type', fk_field='extnodedata_object_id')
class MarkupNodeData(models.Model):
raw_content = models.TextField()
Предположим, мы делаем:
markup = MarkupNodeData(raw_content='...')
base = BaseNodeData(..., extnodedata=markup)
markup.save()
base.save()
# both records are inserted to the DB but base is stored with extnodedata_object_id=NULL
markup = MarkupNodeData(raw_content='...')
base = BaseNodeData(..., extnodedata=markup)
base.save()
markup.save()
# no exception is thrown and everything is the same as above
markup = MarkupNodeData(raw_content='...')
markup.save()
base = BaseNodeData(..., extnodedata=markup)
base.save()
# this works as expected
Конечно, я могу сделать это таким образом, но это ничего не меняет:
base = BaseNodeData(...)
base.extnodedata = markup
Мой вопрос - это ошибка в django, о которой я должен сообщить, или, возможно, я делаю что-то не так. Документы на GenericRelations не совсем подробны.