我有一个具有通用关系的模型(称为 A),在创建此对象的实例时,我将另一个模型的实例(称为 B)作为 content_object 字段的初始化程序(通过构造函数的 kwargs)传递。
如果我在创建 A 之前不保存 B,那么在保存 A 时 content_object_id 将作为 NULL 保存到数据库中。如果我在将 B传递给 A 的构造函数之前保存它,那么一切都很好。
这不合逻辑。我假设在执行 A.save() 时会获取相关对象 (B) 的 ID,如果 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 上的文档并不完全冗长。