Django имеет встроенную функцию под названием Generic Foreign Keys , которая позволяет вам привязать одну таблицу к нескольким моделям таким способом.
Вот как вы будете создавать свои модели:
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
class News(models.Model):
title = models.CharField()
...
class Film(models.Model):
title = models.Charfield()
...
class Calendar(models.Model):
title = models.Charfield()
...
class MetaInfo(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey()
Если хотите, вы можете более подробно рассказать о связи между моделью и MetaInfo, используя GenericRelation
.Например:
class Film(models.Model):
title = models.CharField()
metainfo = generic.GenericRelation('MetaInfo')
...
Это позволяет вам получить доступ к соответствующим записям MetaInfo непосредственно из модели фильма, как в
f = Film.objects.get(pk=1)
for mi in f.metainfo.all():
#mi is a matching MetaInfo record for Film record with pk=1
Просто немного уточнить:
В модели MetaInfo content_type служит эквивалентом вашего столбца tbl (хотя он указывает на конструкцию Django, называемую ContentType; Django создает ее для каждой модели в приложении / наборе приложений), а object_id соответствует вашему ключу fi.На самом деле вы вообще не обращаете особого внимания на эти поля.Вместо этого вы получаете и устанавливаете объект содержимого, который является соответствующей записью.Например, вместо сохранения или извлечения tlb = 'Film', fi = 1, вы получите или установите content_object, который непосредственно соответствует записи фильма, соответствующей pk = 1.
По сути, contenttype__name='Film', object_id=1
в то время какcontent_object=Film.object.get(pk=1)
Все это предполагает, что эта база данных предназначена только для Django.Если это существующая база данных, которую вы пытаетесь использовать в Django, я не знаю простого способа справиться с этим.