毎回__unicode__とか定義するの面倒。2

本来のdjangoの機能を使って実装した方が見通しが良いと教えてもらった。
こんな感じに作れば良いらしい。

from django.db import models

class InspectableModel(models.Model):
    def __unicode__(self):
        field_names = [field.get_attname() for field in self._meta.fields]
        results = []
        results.append('%s object' % self.__class__.__name__)
        for name in field_names:
            text = "  %s: %s" % (name, self.__getattribute__(name))
            results.append(text)
        return unicode("\n".join(results))

    class Meta:
        abstract = True

import datetime

class Blog(InspectableModel):
    title = models.CharField(max_length=255)
    date = models.DateTimeField(default=datetime.datetime.now())
    author = models.CharField(max_length=255, default="anonymous")
    content = models.TextField()

Meta定義したクラスはテーブルを作らない。代わりに継承したクラスに、継承元のクラスのフィールドを作成する。
http://djangoproject.jp/doc/ja/1.0/topics/db/models.html#abstract-base-classes

使用結果

昨日は、実行例を載せていなかったから今日は載せておく。

#python manage.py shell
In [1]: from bar.models import *

In [2]: Blog.objects.create()
Out[2]: 
<Blog: Blog object
  id: 1
  title: 
  date: 2011-03-03 10:54:49.847290
  author: anonymous
  content: >

In [3]: Blog.objects.create(title=u"こんにちは",content="はじめまして、今日から 何か書きます")
Out[3]: <Blog: [Bad Unicode data]>