我在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')
不起作用。当然,我可以继续在基础模型中复制日期时间字段,然后复制标题等等,但我认为这将是错误的方向。如果我不想触摸特定模型,那么继承似乎也不是一种选择。
我正在寻找一些设计模式或某些东西,让我有效地“插入”更多的提供程序并查询所有对象,同时不会造成大量的模型结构和数据库查询。
答案 0 :(得分:0)
你的问题存在根本矛盾。您是否认为,对于给定的图书,不同提供商报告的created
将是相同的?
如果是,为什么不能在created
上创建BaseBook
字段并按此排序?然后,您可以从creation_date
中删除Book
(或者只是忽略它,如果您不想触摸它)。
如果没有,您想如何首先按created
订购图书(不是提供商条目)?
此外,您尝试做的事情听起来像是一个像MongoDB这样的自由模式数据库的好例子。在那里,您可以直接在书籍文档中嵌入提供者条目,然后通过“created
从书籍的第一个提供者条目”中订购。因此,您可以维护自包含的提供程序文档而不进行非规范化。但是,您仍然需要created
对所有提供商来说意味着相同的事情。