我是 django 编程的新手,并试图掌握 GenericForeignKeys。
我设法创建了一个存储在数据库中的通用外键,但该模型似乎没有强制执行参照完整性,
(即,我可以创建对不存在该对象 ID 的对象类型的 ID 的引用)
(例如:content_type:“post”,content_id:123,但post 123不存在)。
(在你说之前 - 是的 - 我知道 Django 有一些标记功能 - 这是一个非常简单的示例/测试,让我了解通用外键,并弄清楚它们是如何工作的,所以我可以在其他情况)
我的基本模型是:
class Tag(NamedModel, models.Model):
taggable_models = models.Q(models.Q(model='post') | models.Q(model='discussion'))
content_type = models.ForeignKey(
ContentType,
models.CASCADE,
limit_choices_to=taggable_models,
)
content_id = models.PositiveIntegerField(
_("content id"),
)
content_object = GenericForeignKey(
'content_type',
'content_id',
)
在我的 admin.py 中,我有:
@admin.register(Tag)
class TagAdmin(VersionAdmin):
readonly_fields = ('created_at',)
list_display = ('content_type', 'content_id', 'created_at', )
fieldsets = (
(None, {
'fields': ('content_type', 'content_id', 'created_at', ),
}),
)
autocomplete_lookup_fields = {
'generic': [['content_type', 'content_id']],
}
但是,当我运行管理页面时,它将允许我针对不存在的帖子 ID 创建一个标签。
有什么方法可以在这里强制执行参照完整性吗?我想我需要以某种方式使用 content_object GenericForeignKey,但我不知道该怎么做?
感谢您的帮助,
克里斯托弗。