3

我是 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,但我不知道该怎么做?

感谢您的帮助,

克里斯托弗。

4

0 回答 0