2

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

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

4

1 回答 1

0

你的问题存在根本矛盾。您是否假设,对于给定的书籍,created不同提供商报告的报告是相同的?

如果是的话,为什么你不能在你的created字段上创建一个字段BaseBook并按那个顺序?creation_date然后,您可以从您的Book(或者只是忽略它,如果您不想触摸它)中删除它。

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

此外,对于像 MongoDB 这样的自由模式数据库,您尝试做的事情听起来像是一个很好的案例。在那里,您可以将提供者条目直接嵌入到您的图书文档中,然后按“从图书的第一个提供者条目创建的<code>”之类的内容进行排序。因此,您无需非规范化即可维护自包含的提供程序文档。但是,您仍然需要created对所有提供者表示相同的意思。

于 2012-06-27T15:46:28.907 回答