Skip to main content
 首页 » 编程设计

python之当 child 不能继承时如何创建基类

2025年05月04日13haluo1

我在 Django 中有一个相当简单的模型,比方说 Book:

class Book(models.Model): 
    name = models.CharField(max_length=255, default="") 
    description = models.TextField(null=True, blank=True) 
    creation_date = models.DateTimeField() 

因为结构和数据基本上来自外部API,所以我已经把它包含在它自己的应用程序中,我不想修改它。

现在我想在项目中添加不同书籍的另一个来源,但我不确定最好的解决方案是什么。

假设第二个模型是:

class NextBook(models.Model): 
    title = models.CharField(max_length=255, default="") 
    long_description = models.TextField(null=True, blank=True) 
    created = models.DateTimeField() 

所以基本字段都在那里,但名称不同。为了将两者结合起来,我可能可以使用另一个带有 GenericForeignKey 的模型:

class BaseBook(models.Model): 
    book_type = models.ForeignKey(ContentType) 
    book_id = models.PositiveIntegerField() 
    book_object = generic.GenericForeignKey('book_type', 'book_id') 

但是我无法查询所有的书,例如BaseBook.objects.all().order_by('created') 不起作用。当然,我可以继续复制基本模型中的日期时间字段,然后是标题等等,但我认为那是错误的方向。如果我不想触及特定模型,继承似乎也不是一个选择。

我正在寻找一些设计模式或让我能够有效地“插入”更多提供程序并查询所有对象的东西,同时又不会造成模型结构和数据库查询的困惑。

请您参考如下方法:

您的问题存在根本矛盾。您是否假设对于给定的图书,不同供应商报告的创建会相同?

如果是,为什么不能在您的 BaseBook 上创建一个 created 字段并以此为准?然后,您可以从 Book 中删除 creation_date(如果您不想触摸它,也可以忽略它)。

如果不是,您首先要如何通过 created 订购书籍(而不是提供商条目)?

此外,您尝试做的事情听起来像是 MongoDB 等自由模式数据库的一个很好的案例。在那里,您可以将供应商条目直接嵌入到您的书籍文档中,然后通过类似“created from the first provider entry for the book”的方式进行排序。因此,您可以维护自包含的提供程序文档而无需非规范化。不过,您仍然需要 created 来对所有提供者表示相同的含义。