使用2个主键建模与元表的关系

时间:2011-01-25 03:49:05

标签: django

我是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来说甚至可能吗?

1 个答案:

答案 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=1content_object=Film.object.get(pk=1)

这是假设此数据库仅供Django使用。如果它是您尝试在Django中使用的现有数据库,那么就没有一种直接的方法可以解决这个问题。