【问题标题】:Django model one foreign key to many tablesDjango为许多表建模一个外键
【发布时间】:2016-02-05 07:35:08
【问题描述】:

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

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

【问题讨论】:

  • 你想要三个中的一个作为 FK 吗?
  • 抱歉,每个状态只能链接到一个请求。

标签: python django postgresql django-models


【解决方案1】:

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

这里有一个通用关系的例子: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">

【讨论】:

  • 哇,这看起来和我想要的完全一样。非常感谢
  • 哈哈,是的。良好的直觉;-)
  • 好,有一个问题:如何从 foo 或对象访问状态对象?
  • Request1是什么意思是类还是导入方法?
猜你喜欢
  • 1970-01-01
  • 2012-07-10
  • 1970-01-01
  • 2011-03-23
  • 2016-12-23
  • 2020-08-27
  • 2021-10-31
  • 2016-03-13
相关资源
最近更新 更多