当childs不能继承时,如何创建基类?

2024-03-29 12:04:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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')不起作用。当然,我可以继续复制基本模型中的datetime字段,然后复制标题等等,但我认为这是错误的方向。如果我不想接触特定的模型,继承似乎不是一个选择。你知道吗

我正在寻找一些设计模式,或者让我高效地“插入”更多的提供者和所有对象的查询,同时又不会造成模型结构和数据库查询的混乱。你知道吗


Tags: 模型truedefaultmodelmodelsdescriptionnulllength
1条回答
网友
1楼 · 发布于 2024-03-29 12:04:55

你的问题有一个根本的矛盾。您是否假设,对于给定的书籍,不同提供者报告的created是相同的?你知道吗

如果是,为什么不能在BaseBook上创建一个created字段并按此排序?然后可以从Book中删除creation_date(或者忽略它,如果你不想碰它的话)。你知道吗

如果没有,您首先要如何按created订购图书(不是提供者条目)?你知道吗

另外,对于MongoDB这样的免费模式数据库来说,您要做的似乎是一个很好的例子。在那里,您可以将提供者条目直接嵌入到图书文档中,然后按照类似“created的方式从图书的第一个提供者条目中排序”。因此,您可以维护自包含的提供者文档,而无需进行非规范化。不过,您仍然需要created对所有提供者表示相同的含义。你知道吗

相关问题 更多 >