我在选择是使用ContentType
还是使用ManyToManyField
时遇到了两难选择。
考虑以下示例:
class Book(Model):
identifiers = ManyToManyField('Identifier')
title = CharField(max_length=10)
class Series(Model):
identifiers = ManyToManyField('Identifier')
book = ForeignKey('Book')
name = CharField(max_length=10)
class Author(Model):
identifiers = ManyToManyField('Identifier')
name = CharField(max_length=10)
class Identifier(Model):
id_type = ForeignKey('IdType')
value = CharField(max_length=10)
class IdType(Model):
# Sample Value:
# Book: ISBN10, ISBN13, LCCN
# Serial: ISSN
# Author: DAI, AIS
name = CharField(max_length=10)
正如您所注意到的,Identifier
正在许多地方使用,事实上,它非常通用,许多与业务相关的对象需要使用Identifier
,类似于how TagItem
from the Django examples。
另一种方法是使用通用关系来概括它。
class Book(Model):
identifiers = GenericRelation(Identifier)
title = CharField(max_length=10)
authors = ManyToManyField(Author)
class Series(Model):
identifiers = GenericRelation(Identifier)
book = ForeignKey('Book')
name = CharField(max_length=10)
class Author(Model):
identifiers = GenericRelation(Identifier)
name = CharField(max_length=10)
class Identifier(Model):
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
id_type = ForeignKey('IdType')
value = CharField(max_length=10)
class IdType(Model):
# Sample Value:
# Book: ISBN10, ISBN13, LCCN, MyLibrary, YourLibrary, XYZLibrary, etc.
# Serial: ISSN, XYZSerial, etc...
# Author: DAI, AIS, XYZAuthor, etc...
name = CharField(max_length=10)
我不确定我是否对通用关系提出了正确的关注。
我担心Identifier
表的数据增长,因为它会在一个表上快速增长,例如:
对于书中的每个记录,标识符表中增加了4-6倍数据。很快,标识符表将成为数百万条记录。从长远来看,查询会变得非常慢吗?此外,我认为标识符是在应用程序中查询和使用的字段。
这种概括是否正确完成?如同,作者标识符与书籍标识符完全无关,并且应该有自己的BookIdentifier
和AuthorIdentifier
。虽然它们似乎有IdType.name
和IdType.value
模式,但域名完全没有关联,一个是作者,另一个是书。他们应该被推广吗?为什么不呢?
如果我要在GenericRelation模型下实现会有什么问题?