我是Django的新手,非常感谢你对这个问题的帮助:
我的网站不同区域(新闻,日历中的活动,电影......)都有一个包含元信息的表格(如点击次数,投票数,评论数......)。该表由两个主键引用(fi = INTEGER和tbl = CHAR)。
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):
fi = ForeignKey(??) # Integer
tbl = ForeignKey(??) # CharField
示例:fi = 1和tbl ='news'将与主键1的新闻条目相关。而fi = 100,tbl ='film'将与主键100的电影输入相关。
如何实现这一目标?这对django来说甚至可能吗?
答案 0 :(得分:1)
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()
如果您愿意,可以使用GenericRelation
更清楚地了解模型与MetaInfo之间的关系。例如:
class Film(models.Model):
title = models.CharField()
metainfo = generic.GenericRelation('MetaInfo')
...
这使您可以直接从Film模型访问相关的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列的等价物(尽管它指向一个名为ContentType的Django构造; Django为app / app中的每个模型构造一个),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中使用的现有数据库,那么就没有一种直接的方法可以解决这个问题。