Django学习——模型

The Django Book》学习笔记

把数据存取逻辑表现逻辑业务逻辑组合在一起的概念被称为软件架构的 Model-View-Controller (MVC)模式。 在这个模式中, Model 代表数据存取层,View 代表的是系统中选择显示什么和怎么显示的部分,Controller 指的是系统中根据用户输入并视需要访问模型,以决定使用哪个视图的那部分。

Django中主要处理模型(Model)、模板(Template)和视图(Views),C由框架自行处理,所以也叫MTV框架,在 MTV 开发模式中

  • M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
  • T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
  • V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

数据库配置

  1. 数据库的安装和数据库驱动安装(这里选择的是mysql和python-mysql)
  2. 数据库配置也是在Django的配置文件里,缺省 是 settings.py,设置如下:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',    # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'mydb',                      # Or path to database file if using sqlite3.
            # The following settings are not used with sqlite3:
            'USER': 'username',
            'PASSWORD': 'passwd',
            'HOST': '',                      # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
            'PORT': '',                      # Set to empty string for default.
        }
    }
  3. 检查数据库配置是否正确
    # python manage.py shell命令进入交互界面
    
    >>> from django.db import connection
    >>> cursor = connection.cursor()
    #如果没有显示什么错误信息,那么你的数据库配置是正确的

创建app

在之前我们已经创建了 project , 那么 project 和 app 之间到底有什么不同呢?它们的区别就是一个是配置另一个是代码:

  • 一个project包含很多个Django app以及对它们的配置。一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。
  • 技术上,project的作用是提供配置文件,比方说哪里定义数据库连接信息, 安装的app列表,TEMPLATE_DIRS ,等等。
  • Django本身内建有一些app,例如注释系统和自动管理界面。 app的一个关键点是它们是很容易移植到其他project和被多个project复用。
  • 如果使用了Django的数据库层(模型),就必须创建一个Django app
    python manage.py startapp books
    #次命令在mysite目录下建立了一个目录books
    ls ~/djcodes/mysite/books
    #显示目录下的文件:__init__.py models.py tests.py views.py

第一个模型

第一步是用Python代码来描述它们。 打开由`` startapp`` 命令创建的models.py 并输入下面的内容:from django.db import models

class Publisher(models.Model):  #每个数据模型都是 django.db.models.Model 的子类。创建Publisher模型
    name = models.CharField(max_length=30)  #类型CharField相当于SQL中的varchar
    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):  #将对象以unicode方式显示出来,一下两个省略不写,请自行补上
return self.name
  class Meta:    #内嵌类,设置一些与特定模型相关的选项,此处设定显示的默认排序方式,同下
   ordering = ['name']
class Author(models.Model):  #创建Author模型 first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=40) email = models.EmailField() class Book(models.Model):  #创建Book模型 title = models.CharField(max_length=100) authors = models.ManyToManyField(Author)  #多对多 publisher = models.ForeignKey(Publisher) publication_date = models.DateField() #最后需要注意的是,我们并没有显式地为这些模型定义任何主键。 除非你单独指明,否则Django会自动为每个模型生成一个自增长的整数主键字段每个Django模型都要求有单独的主键:id

模型安装

完成模型的创建之后,让我们来在数据库中创建这些表。第一步是在 Django 项目中激活这些模型。 将 books app 添加到配置文件的已安装应用列表中即可完成此步骤。

编辑 settings.py 文件, 找到 INSTALLED_APPS 设置

MIDDLEWARE_CLASSES = (
    #'django.middleware.common.CommonMiddleware',
    #'django.contrib.sessions.middleware.SessionMiddleware',
    #'django.middleware.csrf.CsrfViewMiddleware',
    #'django.contrib.auth.middleware.AuthenticationMiddleware',
    #'django.contrib.messages.middleware.MessageMiddleware',  #此处五项依赖下面注释掉的五项,为避免错误,此处将其也注释掉
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

INSTALLED_APPS = (
    #'django.contrib.auth',
    #'django.contrib.contenttypes',
    #'django.contrib.sessions',
    #'django.contrib.sites',
    #'django.contrib.messages',
    #'django.contrib.staticfiles',    #前五项是默认设置的条目,在这里我们将它们临时注释掉,以后再讨论
    # Uncomment the next line to enable the admin:
    # 'django.contrib.admin',
    # Uncomment the next line to enable admin documentation:
    # 'django.contrib.admindocs',
    'books',  #亦即~/djcodes/mysite/books
)

设置好之后检验配置是否正确:python manage.py validate

模型没有错误,使用命令生成 CREATE TABLE 语句:python manage.py sqlall bookssqlall 命令并没有在数据库中真正创建数据表,只是把SQL语句段打印出来。

同步到数据库:python manage.py syncdb。syncdb命令只会提交新的app到数据库,如果你想修改或删除模型,syncdb不会做任何改变。需要使用其他方法

!创建数据实例与编辑数据库

>>> from books.models import Publisher
>>> p = Publisher(name='Apress',
...         address='2855 Telegraph Ave.',
...         city='Berkeley',
...         state_province='CA',
...         country='U.S.A.',
...         website='http://www.apress.com/')
>>> p.save()    #第一次save是插入,之后save是修改

>>> Publisher.objects.all()    #all方法返回一个QuerySet 对象, 这个对象是数据库中一些记录的集合

>>> Publisher.objects.filter(name='Apress')    #此处是精确匹配
>>> Publisher.objects.filter(name__contains="press") #双下划线表示魔术操作,其他的一些查找类型有:icontains(大小写无关),startswith和endswith, 还有range(BETWEEN)

>>> Publisher.objects.get(name="Apress")  #filter返回记录列表,get返回单个对象,如果结果是多个对象或没有匹配对象则会抛出异常

>>> Publisher.objects.order_by("name")  #数据排序,可以指定多字段,也可以在定义Publisher模板时指定默认排序方式

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

>>> Publisher.objects.order_by('name')[0:2]  #对返回数据限制条件,不支持负索引

>>> Publisher.objects.filter(id=52).update(name='Apress Publishing')  #更新对象

>>> Publisher.objects.filter(country='USA').delete()  #删除对象

 主要参考《the django book》

原文地址:https://www.cnblogs.com/lifan/p/3101898.html