Есть ли способ создать поле 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
Общим способом управления этим может быть использование собственных моделей.
Создайте модель ChoiceItemGroup, slug, name, description.
Создайте другую модель ChoiceItem, со slug, name, description и FK в ChoiceItemGroup.
Тогда вы можете сделать:
type=models.ForeignKey(ChoiceItem, on_delete=models.CASCADE)
Затем вы можете создавать типовые варианты и типовые группы вариантов, регистрируя модели в панели администратора