2012-04-12 78 views
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) 
     ) 

我有两个与此型号代码相关的问题。需要关于Django评论的BaseCommentAbstractModel的一些解释应用程序

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

_()是一个本地化字符串(通常)的功能,所以如果有人用西班牙语查看页面,它会存储为类似于“identifyicacion de objecto” – 2012-04-12 18:01:02

+0

@JoranBeasley是正确的...除了“store”部分。详细名称仅存在于python代码中。它们不以任何方式存储到数据库中。 – John 2012-04-12 18:07:28

回答

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。

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