Есть ли способ создать поле foreignkey в модели django с переменной выбора?

Допустим, у меня есть три модели device, mechanical и digital. В модели устройства у меня есть поле type. Поле type должно находиться в отношениях внешнего ключа с моделью mechanical или digital, которая будет определяться данными. Есть ли способ создать поле type таким образом, чтобы модель, в которой будет выполняться связь внешнего ключа, можно было выбрать вручную. Что-то вроде: type = models.ForeignKey(to=Choices) где Choices может быть цифровым и механическим.

Я пытался реализовать общие внешние ключи, но схема моей базы данных немного сложна, поэтому поддерживать ее будет очень трудно. Есть ли другой способ в django, чтобы я мог сделать вышеописанное?

Добавление внешнего ключа из одной из ваших собственных моделей в ContentType позволяет вашей модели эффективно привязать себя к другому классу моделей. Но можно пойти еще дальше и использовать ContentType для обеспечения действительно общих (иногда называемых "полиморфными") отношений между моделями.

Например, он может быть использован для системы тегов следующим образом:

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType, 
    on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    def __str__(self):
        return self.tag

Django generic relations

Общим способом управления этим может быть использование собственных моделей.

Создайте модель ChoiceItemGroup, slug, name, description.

Создайте другую модель ChoiceItem, со slug, name, description и FK в ChoiceItemGroup.

Тогда вы можете сделать:

type=models.ForeignKey(ChoiceItem, on_delete=models.CASCADE)

Затем вы можете создавать типовые варианты и типовые группы вариантов, регистрируя модели в панели администратора

Вернуться на верх