Django为多个表建模一个外键 [英] Django model one foreign key to many tables
问题描述
所以我有一个问题,我正在考虑创建一个具有指向其他多个表的外键的表,并使用另一个字段 type来说明该键应属于哪个表。
So I have a question I was thinking of creating a single table that has a foreign key to several other tables, and using another field "type" to say what table the key should belong to.
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
我的问题是,是否可以像这样定义外键?
我想到的另一个解决方案是像这样定义我的模型
My question is, is it possible to define a foreign key like this? another solution I thought of was to define my model like this
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定义一个约束,即只允许一个外键具有数据,而另外两个必须为null?还是我必须在数据库方面严格设置此约束。(我使用的是postgres)我希望能够告诉django在创建数据库时执行此操作,因此我不必每次都记住某人重新创建数据库。
But if I do it this way is it possible to define a constraint via django that says only 1 foreign key is allowed to have data and the other two must be null? or will I have to strictly set this constraint up on the db side.(I'm using postgres) I would like to be able to tell django to do it when it creates the db so I don't have to remember every time someone recreates the db.
任何输入或建议都将不胜感激。我对这两种想法都不满意,因此,如果有另一种巧妙的方法来达到相同的效果,我将倾听。感谢您的时间。
Any input or advice would be greatly appreciated. I am not married to either of these ideas, so if there is another clever way to achieve the same effect i am up to hear it. Thank you for your time.
编辑:我正在使用Django 1.7.10
I am using django 1.7.10
推荐答案
您应该在Django中使用contentypes框架。
You should use the contentypes framework in Django.
这里有一个通用关系的示例:> https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#generic-relations
根据您的要求,它看起来可能像这样:
There's an example for a generic relation here :https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#generic-relations For your requirement it could look something like this:
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')
然后您可以执行以下操作:
You can then do something like following:
status1 = Status(request=Request1("foo"))
status1.save()
status2 = Status(request=Request2("bar"))
status2.save()
status1.request // <Request1 "foo">
status2.request // <Request2 "bar">
这篇关于Django为多个表建模一个外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!