gpt4 book ai didi

python - Django - 外键根据其内容引用两个表之一

转载 作者:行者123 更新时间:2023-11-29 13:24:04 32 4
gpt4 key购买 nike

我在数据库模型设计中遇到了死胡同,需要一些帮助。我们使用 Postgres 数据库和 django 框架来存储各种论文、书籍等。

这些是我遇到问题的基类:

class Publisher(models.Model):
name = models.CharField(unique=True)
website = models.URLField(blank=True)
#...

class Editor(models.Model):
firstname = models.CharField()
lastname = models.CharField()
#...

class Book(models.Model):
title = models.CharField(unique=True)
#...
editors = models.ManyToManyField(Editor, blank=True)
publisher = models.ForeignKey(Publisher, blank=True)
#...

上面的 Editor 类被建模为将编辑器存储为相应书籍的人物,例如。 “瑞安·凯里”或“尼古拉斯·罗”。Publisher 类将保存诸如“芝加哥大学出版社”之类的信息。

如果 Editor 和 Publisher 相同,问题就会出现。例如,Editor 和 Publisher 都应该是“University of Chicago Press”。

现在,每当通过 django-admin 界面将新书保存到数据库时,我希望发生以下情况:

  • 如果给出了一个或多个编辑器,请将其保存为上面的模型。
  • 如果没有给出 Editors 但给出了 Publisher,那么让 editors 指向发布者指向的同一个 key
  • 如果两者都没有给出则留空

我正在考虑以某种方式实现它:

class Book:
#...
def save(self, *args, **kwargs):
if self.editors.count() <= 0 and self.publisher:
self.editors = self.publisher #This is not possible
super(Book, self).save(*args, **kwargs)

self.editors = self.publisher 位也许可以通过继承来修复,但是仍然有多个编辑器和一个发布者,我不希望发布者和编辑器存储在同一个表中。

关于如何处理这个问题有什么想法吗?

最佳答案

几乎不需要重新构建您的模型,这是可能的,而且会比现在更加灵活。

首先:不要将发布者和编辑者置于 2 个不同的模型中。做一个。

第二:如果你可以同时拥有个人和组织/公司的发布者/编辑(这将需要不同的模型字段),将所有公共(public)字段放入一个模型中并制作 2 个将从该模型继承的模型,包含更多指定字段.这将在底层创建字段之间的一对一关系。

第三:在你的书籍模型中创建 2 个字段,一个名为 publisherForeignKey 和一个名为 editorsManyToMany .两种关系都应指向发布者/编辑器的基本模型。

示例代码:

class PEBase(models.Model): # have no idea how to name it better

some_common_field = models.Field(...)


class PEPerson(PEBase):

first_name = models.CharField()
last_name = models.CharField()


class PEOrganization(PEBase):

name = models.CharField()
website = models.URLField()


class Book(models.Model):

title = models.CharField(unique=True)
#...
editors = models.ManyToManyField(PEBase, blank=True, related_name="books_edited")
publisher = models.ForeignKey(PEBase, blank=True, related_name="books_published")

def save(self, *args, **kwargs):
super(Book, self).save(*args, **kwargs)
if self.editors.count() <= 0 and self.publisher:
self.editors.add(self.publisher) #This must go after save - ID of book must be already set.

关于python - Django - 外键根据其内容引用两个表之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36970571/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com