使用Django ContentType Framework是否合适,或者通过M2M关系保持简单?

时间:2016-07-21 08:11:03

标签: python django django-contenttypes

我在选择是使用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)

我不确定我是否对通用关系提出了正确的关注。

  1. 我担心Identifier表的数据增长,因为它会在一个表上快速增长,例如:

    • 100,000本书,每本平均4个标识符。 (总共400,000个标识符记录)
    • 每本书平均2位作者(总共200,000个标识符记录)

    对于书中的每个记录,标识符表中增加了4-6倍数据。很快,标识符表将成为数百万条记录。从长远来看,查询会变得非常慢吗?此外,我认为标识符是在应用程序中查询和使用的字段。

  2. 这种概括是否正确完成?如同,作者标识符与书籍标识符完全无关,并且应该有自己的BookIdentifierAuthorIdentifier。虽然它们似乎有IdType.nameIdType.value模式,但域名完全没有关联,一个是作者,另一个是书。他们应该被推广吗?为什么不呢?

  3. 如果我要在GenericRelation模型下实现会有什么问题?

0 个答案:

没有答案