Django 6(モデル)


1. models.py
  

    from django.db import models

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=50)
        website = models.URLField()

        def __unicode__(self):
            return self.name

    class Author(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=40)
        email = models.EmailField()

        def __unicode__(self):
            return u'%s%s'% (self.first_name, self.last_name)

    class Book(models.Model):
        title = models.CharField(max_length=100)
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher)
        publication_date = models.DateField()

        def __unicode__(self):
            return self.title
   

2.モデルの取り付け
   $ vim settings.py
INSTALLED_を修正APPS:
  

    INSTALLED_APPS = (
        'mysite.books',
    )
   

MIDDLEWARE_を修正CLASSSES:
  

    MIDDLEWARE_CLASSES = ( 
    )
   

   INSTALLED_APPSはDjangoプロジェクトにどのappがアクティブになっているかを教えます.
3.データベースの作成:
   $ python manage.py validate#検証モデルの有効性
   $ python manage.py sqlall books#CREATE TABLE文の生成
ここのbooksはappの名前で、manageを実行します.py startappのように
   $ python manage.py syncdb#同期モデルからデータベースへ
4.基本データアクセス:
モデルが作成されると、Djangoはこれらのモデルに高度なPython APIを自動的に提供します.
   $ python manage.py shell
  
  

    >>> from books.models import Publisher
    >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
    ...     city='Berkeley', state_province='CA',
    ...     website='http://www.apress.com/')
    >>> p1.save()        #  
    >>> p2 = Publisher(name='Thk', address='2855 Telegraph Avenue',
    ...     city='Berkeley', state_province='CA',
    ...     website='http://www.apress.com/')
    >>> p2.save()
    >>> publisher_list=Publisher.objects.all() 
    >>> publisher_list
   

上記のコードは次のとおりです.
  

    >>> from books.models import Publisher
    >>> p1 = Publisher.objects.create(name='Apress', 
    ...     address='2855 Telegraph Avenue',
    ...     city='Berkeley', state_province='CA',
    ...     website='http://www.apress.com/')
    >>> p2 = Publisher.objects.create(name='Thk', 
    ...     address='2855 Telegraph Avenue',
    ...     city='Berkeley', state_province='CA',
    ...     website='http://www.apress.com/')
    >>> publisher_list=Publisher.objects.all() 
    >>> publisher_list
   

更新(update):
  

    >>> p2.name='Thinking'
    >>> p2.save()
    >>> p2
   

データフィルタ
  

    >>> Publisher.objects.filter(name='Thinking')
   

データフィルタリング(包括的検索)
  

    >>> Publisher.objects.filter(name__contains='Thin')
   

その他の検索タイプは、icontains(大文字と小文字に関係のないLIKE)、startswith、
endswith、そしてrange(SQL BETWEENクエリー)
個々のオブジェクトを取得するには、次の手順に従います.
  

    >>> Publisher.objects.get(name="Apress")
   

データのソート:
  

    >>> Publisher.objects.order_by('name')
   

  
コードを変更して、デフォルトのソートを指定します.
  

    from django.db import models

    class Publisher(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=50)
        city = models.CharField(max_length=60)
        state_province = models.CharField(max_length=50)
        website = models.URLField()

        def __unicode__(self):
            return self.name

        class Meta:
            ordering = ['name']
   

チェーンクエリ:
  

    >>> Publisher.objects.filter(city='Berkeley').order_by("-name")
   

返されるデータの制限:(1つのみ取り出し)
  

    >>> Publisher.objects.order_by('name')[0]  
        or
    >>> Publisher.objects.order_by('name')[0:1]
   

  
DjangoはPythonの負のインデックスをサポートしていませんが、以下の代わりに使用できます.
  

    >>> Publisher.objects.order_by('-name')[0]
   

複数のオブジェクトを更新:
  

    >>> p = Publisher.objects.get(name='Apress')
    >>> p.name = 'Apress Publishing'
    >>> p.save()
   

上のsave()メソッドはname列の値だけでなく、すべての列を更新します.
指定した列を変更し、結果セット(QuerySet)オブジェクトのupdate()メソッドを呼び出すことができます.
  

    >>> Publisher.objects.filter(id=1).update(name='Apress')
   

同時に、複数のレコードを更新します.
  

    >>> Publisher.objects.all().update(address='Hotel')
   

オブジェクトを削除するには
  

    >>> p2 = Publisher.objects.get(name='Thinking')
    >>> p2.delete()
   

  

    >>> Publisher.objects.filter(address='Hotel').delete()
   

  

    >>> Publisher.objects.all().delete()