2015-11-04 48 views
5

所以我有一个问题,我正在考虑创建一个表,其中有一个外键到其他几个表,并使用另一个字段“类型”来说什么表该键应该属于。Django对许多表模型一个外键

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外键允许有数据和其他两个必须为空?或者我将不得不在数据库端严格设置这个约束(我使用的是postgres)我希望能够告诉django在创建数据库的时候这样做,所以我不必每次都记得有人重新创建数据库。

任何意见或建议将不胜感激。我没有结过这两种想法,所以如果有另一种巧妙的方法来达到同样的效果,我很乐意听到它。感谢您的时间。

编辑:我使用Django 1.7.10

+0

你只想三个之一是FK? –

+0

对不起,每个状态只能链接到一个请求。 – mingle

回答

12

您应该使用在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"> 
status1.request // <Request2 "bar"> 
+0

哇,这看起来完全像我在找的东西。非常感谢你 – mingle

+0

哈哈,是的。好的直觉;-) – Sebastian

+0

好的,有一个问题:如何从foo或object访问状态对象? –