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

私はこのモデルコードに関連する2つの質問があります。djangoコメントアプリのBaseCommentAbstractModelに関する説明が必要

  1. models.TextField(_('object ID'))おそらく冗長なオブジェクトIDです。このTextFieldの名前は、データベースにどのように反映されますか?
  2. なぜdjangoはabc(AbstractBaseClass)モジュールを使用するのではなく、Meta内部クラスのフィールドabstractに依存していますか?確かにその冗長な名前です
+0

_()は、文字列を(通常は)ローカライズするための機能です。つまり、スペイン語でページを表示している場合、 "identificacion de objecto"のように保存されます。 –

+0

@JoranBeasleyは正しいです... "store" 。 Verboseの名前はPythonコード内にのみ存在します。これらはデータベースには何も格納されません。 – John

答えて

2
  1. _ugettext_lazyへの呼び出しで、文字列をローカライズすることを理解していると思います。これはフィールドの冗長な名前です。詳細な名前はデータベースには表示されません。データベース内のフィールドの名前はobject_pkです。

  2. 私は権限があると話すことはできませんので、私はジャンゴデベロッパーではありませんが、いくつかのことは明らかです。 ABCはPython 2.6で新しく追加されました。最近のリリースでは、最小限のPythonバージョンが最終的に2.5に移行されたため、これは問題です。これは後半になってかなり急速に打撃を受けている。例えば、Python 2.4が必要になったのはdjango 1.2のみでした。抽象モデルは少なくともdjango 1.0と同じくらいまで存在していましたが、私はそれをさらに深く考えています(しかし、私は確かに思い出すことはできません)。ABCが適切であっても(これは私がモデルはちょっと複雑です)、Pythonのバージョンが必要なため、この時点でdjangoには適していません。

さらにいくつかの複雑さは、データベースだけではなく、データ構造を表すクラスの管理にあります。これが抽象モデルにどれだけ影響を与えるかはわかりませんが、たとえばFieldインスタンスであるdjango属性でフィールド隠蔽を実行することはできません。

関連する問題