DjangoBook笔记-2

## date: 2010-4-13 09:30

8. 数据库配置
    setting.py中关于数据库配置的部分:
        DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        DATABASE_NAME = ''             # Or path to database file if using sqlite3.
        DATABASE_USER = ''             # Not used with sqlite3.
        DATABASE_PASSWORD = ''         # Not used with sqlite3.
        DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
        DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
    
    对于SQLite数据,仅需指定
        DATABASE_ENGINE = 'sqlite3'    # 使用sqlite3引擎
        DATABASE_NAME = 'djangotest.sqlite'  #文件名自定义
    即可完成配置,下一阶段探索配置并学习postgresql

9. 创建子应用
    从技术上讲,project是负责提供项目配置的,包括数据库连接、app列表等待
    而app是一套功能集合,包括模型和视图
    
    在"mysite"项目文件夹下创建books应用程序app
        python manage.py startapp books
        
    这样就在mysite下建立books文件夹,目录结构:
        books/
            __init__.py
            models.py
            tests.py
            views.py
    这样数据模型就可以在models.py中进行定义了


10. 建立数据模型
    官方演示的例子:
        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=30)
            country = models.CharField(max_length=50)
            website = models.URLField()
        
        class Author(models.Model):
            first_name = models.CharField(max_length=30)
            last_name = models.CharField(max_length=40)
            email = models.EmailField()
        
        class Book(models.Model):
            title = models.CharField(max_length=100)
            authors = models.ManyToManyField(Author)
            publisher = models.ForeignKey(Publisher)
            publication_date = models.DateField()
            
    Publisher就相当于数据库中的表:
        CREATE TABLE "books_publisher" (
            "id" serial NOT NULL PRIMARY KEY,
            "name" varchar(30) NOT NULL,
            "address" varchar(50) NOT NULL,
            "city" varchar(60) NOT NULL,
            "state_province" varchar(30) NOT NULL,
            "country" varchar(50) NOT NULL,
            "website" varchar(200) NOT NULL
        );


11. 数据模型的安装
    模型安装就是将books在settings.py的INSTALLED_APPS中指定
        INSTALLED_APPS = (
            # 'django.contrib.auth',
            # 'django.contrib.contenttypes',
            # 'django.contrib.sessions',
            # 'django.contrib.sites',
            'mysite.books',
        )


12. 模型的验证
    有效性验证:
        python manage.py validate
        
    SQL验证:
        python manage.py sqlall books
        
        SQL验证会生产建立表的SQL语句,这些表默认都会自动建立一个id字段的
            "id" serial NOT NULL PRIMARY KEY
            
        sqlall只是生产了sql语句,并没有真正建立表
    
    数据库建立表
        python manage.py syncdb  # 也就是同步模型到数据库中


13. 数据的使用
    这个比较重要,通过前面的安装已经在数据库和程序中指定好了数据结构,\
    下一步既是数据的使用了

    13.1 基本数据访问
        在Shell中创建两个Publisher实例并调用
            >>> from books.models import Publisher
            >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
            ...     city='Berkeley', state_province='CA', country='U.S.A.',
            ...     website='http://www.apress.com/')
            >>> p1.save()    # 这里才真正保存了p1对象
            >>> p2 = Publisher(name="O'Reilly", address='10 Fawcett St.',
            ...     city='Cambridge', state_province='MA', country='U.S.A.',
            ...     website='http://www.oreilly.com/')
            >>> p2.save()
            >>> publisher_list = Publisher.objects.all()
            >>> publisher_list
            [<Publisher: Publisher object>, <Publisher: Publisher object>]

        上面在调用object.all后仅仅得到的是两个实例展示,
        获得字符串表现的展示方法为在模型实体中加入__unicode__对象:
            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=30)
                country = models.CharField(max_length=50)
                website = models.URLField()

                def __unicode__(self):
                    return self.name  # 这样再展示实例时会显示name出来
            这样再调用对象,展示结果为:
                >>> publisher_list
                [<Publisher: Apress>, <Publisher: O‘Reilly>] # O'Reilly
                
            其他对象方法同上
    
    13.2 插入和更新数据
        插入数据的方法前面的例子即是,主要要调用对象的save()方法来保存
        更新的方法:
            >>> p1.name = 'Apress Publishing'
            >>> p1.save()

    13.3 数据过滤
        数据过滤也就是指定WHERE进行选择
        选择所以对象的方法:
            Publisher.objects.all()

        使用过滤:
            >>> Publisher.objects.filter(name='Apress')
            [<Publisher: Apress>]

        多个条件:
            >>> Publisher.objects.filter(country="U.S.A.", state_province="CA")
            [<Publisher: Apress>]
        
        模糊查找
        默认情况下使用filter并指定name=则使用的是精确查找,要模糊查找:
            Publisher.objects.filter(name__contains="press")
        使用name__contains就等价于 WHERE name LIKE '%press%'
        
        除contains外,还有其他一些类型的过滤查找:
            icontains     # 大小写无关的LIKE
            startswith    # 'press%'
            endswith      # '%press'
            range         # between

    13.4 获取单个对象
        上面使用filter后返回的是list,要返回单个对象可以使用get方法
            Publisher.objects.get(name='Apress')
            
        如果指定条件后返回的对象多于一个会抛出异常:MultipleObjectsReturned
        同样没有返回值的话也会抛出异常:DoesNotExist

        排除异常的一个应用:
            try:
                p = Publisher.objects.get(name='Apress')
            except Publisher.DoesNotExist:
                print "Apress isn't in the database yet."
            else:
                print "Apress is in the database."

    13.5 数据排序
        使用order_by()方法实现排序
            Publisher.objects.order_by("address")
            Publisher.objects.order_by("state_province", "address")
        逆序
            Publisher.objects.order_by("-name")
        
        缺省选择排序,即在数据模型实体定义时加入Meta方法:
            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=30)
                country = models.CharField(max_length=50)
                website = models.URLField()
            
                def __unicode__(self):
                    return self.name
            
                class Meta:
                    ordering = ['name']

    13.6 连锁查询
        Publisher.objects.filter(country="U.S.A.").order_by("-name")

    13.7 限制返回数量
        Publisher.objects.order_by('name')[0]  # 相当于 LIMIT 1
        Publisher.objects.order_by('name')[0:2]  # OFFSET 0 LIMIT 2

    13.8 更新多个对象
        单个对象更新前面已有例子
            p.name = 'Apress Publishing'
            p.save()
            
        改动任意对象的更新,即结合filter进行:
            Publisher.objects.filter(id=5).update(name='Apress Publishing')
            Publisher.objects.all().update(country='USA')
    
    13.9 删除对象
        删除对象使用对象的delete()方法
        强调:删除需谨慎!
            p = Publisher.objects.get(name="O'Reilly")
            p.delete()
            
            Publisher.objects.filter(country='USA').delete()
            Publisher.objects.all().delete()

posted @ 2010-04-13 15:56  听风  阅读(433)  评论(0编辑  收藏  举报