簡體   English   中英

Django為許多表建模一個外鍵

[英]Django model one foreign key to many tables

所以我有一個問題,我正在考慮創建一個具有其他幾個表的外鍵的單個表,並使用另一個字段“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

您應該在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">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM