需要关于django评论应用程序的BaseCommentAbstractModel的一些解释

时间:2012-04-12 17:43:27

标签: python django

class BaseCommentAbstractModel(models.Model):
    """
    An abstract base class that any custom comment models probably should
    subclass.
    """

    # Content-object field
    content_type   = models.ForeignKey(ContentType,
            verbose_name=_('content type'),
            related_name="content_type_set_for_%(class)s")
    object_pk      = models.TextField(_('object ID'))
    content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")

    # Metadata about the comment
    site        = models.ForeignKey(Site)

    class Meta:
        abstract = True

    def get_content_object_url(self):
        """
        Get a URL suitable for redirecting to the content object.
        """
        return urlresolvers.reverse(
            "comments-url-redirect",
            args=(self.content_type_id, self.object_pk)
        )

我有两个与此型号代码相关的问题。

  1. models.TextField(_('object ID'))对象ID可能是此TextField的详细名称,它如何反映在数据库中?
  2. 为什么Django依赖Meta元类的字段abstract而不是使用abc(AbstractBaseClass)模块?

1 个答案:

答案 0 :(得分:2)

  1. 这确实是那个冗长的名字。我假设您了解_是对ugettext_lazy的调用,用于本地化字符串。这是该字段的详细名称。详细名称未在数据库中表示。数据库中字段的名称为object_pk。

  2. 我不是django dev,所以我不能说话,但有些事情是显而易见的。 ABC是Python 2.6的新功能。这是一个问题,因为从最近的版本开始,最小的python版本最终被移动到2.5。这种情况最近很快就受到了冲击。例如,仅在django 1.2上才需要python 2.4。抽象模型至少存在于django 1.0之后,我认为甚至更晚(尽管我无法回想起)所以即使ABC也适合(我不确定它是否因为模型有点复杂),由于所需的python版本,此时它不适合django。

  3. 此外,管理代表数据库的类而不仅仅是数据结构存在一些复杂性。我不确定这对抽象模型有多大影响,但是例如你不能在作为Field实例的django属性上执行字段隐藏。