0
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 依赖abstractMeta 内部类的字段而不是使用 abc(AbstractBaseClass) 模块?
4

1 回答 1

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

  2. 我不是 django 开发人员,所以我不能以权威说话,但有些事情是显而易见的。ABC 是 Python 2.6 中的新功能。这是一个问题,因为从最新版本开始,最低 python 版本终于移到了 2.5。近来,这种情况很快就发生了变化。例如,只有在 django 1.2 上才需要 python 2.4。抽象模型至少早在 django 1.0 就已经存在,我认为甚至更早(虽然我不能确定)所以即使 ABC 是合适的(我不确定这是因为模型有点复杂),由于所需的python版本,它目前不适合django。

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

于 2012-04-12T18:05:24.130 回答