当一个对象可以属于其他几个对象时,外键属于哪里?

时间:2018-02-08 18:39:41

标签: django postgresql database-design

使用Django 1.11.6和Postgres 9.2

如果我有以下型号:

class RoughDraft(models.Model)

class Manuscript(models.Model):
    rough_draft = models.ForeignKey(RoughDraft)

class AudioBook(models.Model):
    manuscript = models.ForeignKey(Manuscript)

class Series(models.Model):

class Book(models.Model):
    manuscript = models.ForeignKey(Manuscript)
    series = models.ForeignKey(Series)

我想在我的项目中添加一个Notes模型,以允许多个用户为RoughDrafts,Manuscripts,Books和AudioBooks添加注释。此外,当RoughDraft成为手稿或手稿成为书籍或AudioBook时,我希望将笔记继续下去。

创建这样的笔记模型是否更好:

class Notes(models.Model):
   text = models.TextField()

并为RoughDraft,Manuscript,Book,Series和AudioBook中的每一个添加notes = models.ManyToMany(Notes)字段

class Notes(models.Model):
    text = models.TextField()
    rough_draft = models.ForeignKey(RoughDraft, null=True, blank=True)
    manuscript = models.ForeignKey(Manuscript, null=True, blank=True)
    series = models.ForeignKey(Series, null=True, blank=True)
    book = models.ForeignKey(Book, null=True, blank=True)
    audio_book = models.ForeignKey(AudioBook, null=True, blank=True)

或者我应该创建ManuscriptNotes模型,RoughDraftNotes模型等......

1 个答案:

答案 0 :(得分:0)

您可以在Django中使用"generic key"

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

class Note(models.Model):

    content = models.TextField()
    author = models.ForeignKey(User, ...)

    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

这允许您将Note对象与数据库中的任何其他对象相关联