Django为许多表建模一个外键

时间:2015-11-04 17:20:39

标签: python django postgresql django-models

所以我有一个问题,我正在考虑创建一个具有其他几个表的外键的单个表,并使用另一个字段“type”来说明该键应该属于哪个表。

class Status(Models.model):
    request = models.ForeignKey("Request1", "Request2", "Request3")
    request_type = models.IntegerField()
    ...Some status related data

class Request1(Models.model):
    ...Some data

class Request2(Models.model):
    ...Some other data

Class Request3(Models.model):
   ...different data

我的问题是,是否可以定义这样的外键? 我想到的另一个解决方案是像这样定义我的模型

class Status(Models.model):
    request1 = models.ForeignKey("Request1")
    request2 = models.ForeignKey("Request2")
    request3 = models.ForeignKey("Request3")
    ...Some status related data

class Request1(Models.model):
    ...Some data

class Request2(Models.model):
    ...Some other data

Class Request3(Models.model):
   ...different data

但是,如果我这样做,是否可以通过django定义约束,该约束表示只允许1个外键拥有数据而另外两个必须为空?或者我是否必须在db端严格设置此约束。(我正在使用postgres)我希望能够告诉django在创建db时这样做,所以我不必记住每次有人重新创建数据库。

非常感谢任何意见或建议。我没有和这些想法中的任何一个结婚,所以如果有另一种聪明的方法来达到同样的效果,我就能听到它。感谢您的时间。

编辑:我正在使用django 1.7.10

1 个答案:

答案 0 :(得分:15)

您应该在Django中使用contentypes框架。

这里有一个关于通用关系的示例:https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#generic-relations 根据您的要求,它可能看起来像这样:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Status(models.Model):
    request_type = models.ForeignKey(ContentType)
    request_id = models.PositiveIntegerField()
    request = GenericForeignKey('request_type', 'request_id')

然后您可以执行以下操作:

status1 = Status(request=Request1("foo"))
status1.save()
status2 = Status(request=Request2("bar"))
status2.save()

status1.request // <Request1 "foo">
status2.request // <Request2 "bar">