Джанго GenericForeignKey Ссылочная INtegrity - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в программировании на Django и пытаюсь освоить GenericForeignKeys.

Мне удалось создать общий внешний ключ, который хранится в базе данных, но модель, по-видимому, не обеспечивает ссылочную целостность,

(т.е. я могу создать ссылку на идентификатор типа объекта, где этот идентификатор объекта не существует)

(например, 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']],
        }

Однако, когда я запускаю страницу администратора, это позволяет мне создать тег для идентификатора записи, который не существует.

Есть ли способ, которым я могу обеспечить ссылочную целостность здесь? Я думаю, мне нужно как-то использовать content_object GenericForeignKey, но я не могу понять, как это сделать?

Спасибо за любую помощь,

Кристофер.

...