您的位置:首页 > 编程语言 > Go语言

django学习笔记5:模型

2016-06-30 22:11 549 查看
Django模型(数据库)
修改mytest\mytest\settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

根据不同的数据库连接填不同的内容(这里以sqlite3为例)
mysql配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'test',
'PASSWORD': 'test123',
'HOST':'localhost',
'PORT':'3306',
}
}


进入app中修改mytest\test1\models.py
from __future__ import unicode_literals
from django.db import models

class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
数据库模型对应关系,class是表名,变量是列名和列类型

执行命令:
python manage.py makemigrations
python manage.py migrate
makemigrations: 基于当前的model创建新的迁移策略文件
migrate: 用于执行迁移动作

在执行完 python manage.py makemigrations 命令后 mytest\test1\migrations目录下会出现一个 0001_initial.py 文件
看了0001_initial.py的源码会发现这个应该才是建表程序,而python manage.py migrate命令应该是执行这个文件,因为执行完migrate命令会出现一个0001_initial.pyc文件





命令执行后表就建好了

添加一条数据
执行python manage.py shell
>>> from test1.models import Person
>>> Person.objects.create(name="Jun", age=24)
<Person: Person object>



查询
>>> Person.objects.get(name="Jun")
<Person: Person object>
查询结果是一个类型,这样同类型的数据多了就不知道那个和那个了

需要修改models.py
from __future__ import unicode_literals
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    def __unicode__(self):
        return self.name
__unicode__()函数是表示对象展现的形式,这里显示name

>>> from test1.models import Person
>>> Person.objects.get(name="Jun")
<Person: Jun>

如果查询的对象没有会报错



添加数据的几种方式
执行python manage.py shell
第一种:
>>> from test1.models import Person
>>> Person.objects.create(name='jlon',age=18)
<Person: jlon>

第二种:
>>> from test1.models import Person
>>> p = Person.objects.create(name='ET',age=19)
>>> p.save()

第三种:
>>> from test1.models import Person
>>> pp = Person(name='GG')
>>> pp.age=17
>>> pp.save()

第四种:
>>> from test1.models import Person
>>> Person.objects.get_or_create(name='DNA',age=16)
(<Person: DNA>, True)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

获取对象的方式的集中方法:
执行python manage.py shell
第一种:
>>> from test1.models import Person
>>> Person.objects.all()
[<Person: Jun>, <Person: jlon>, <Person: ET>, <Person: GG>, <Person: DNA>]
返回全部对象

第二种:
>>> from test1.models import Person
>>> Person.objects.all()[:2]
[<Person: Jun>, <Person: jlon>]
用切片获取前两个

第三种:
>>> from test1.models import Person
>>> Person.objects.get(name='DNA')
<Person: DNA>
这个方法如果列值不存在会报错



第四种:
>>> Person.objects.filter(name="abc")
[]
如果不存在返回空列表
>>> Person.objects.filter(name="DNA")
[<Person: DNA>]

第五种:
>>> Person.objects.filter(name__iexact="abc")
[]
>>> Person.objects.filter(name__iexact="dna")
[<Person: DNA>]
>>> Person.objects.filter(name__iexact="dNA")
[<Person: DNA>]
不存在返回空,不区分大小写

第六种:
>>> Person.objects.filter(name__contains="N")
[<Person: Jun>, <Person: jlon>, <Person: DNA>]
模糊查询,不区分大小写

第七种:
>>> Person.objects.filter(name__icontains="n")
[<Person: Jun>, <Person: jlon>, <Person: DNA>]
模糊查询,也不区分大小写,不知道和第六种有什么区别

第八种:
>>> Person.objects.filter(name__regex="^j")
[<Person: jlon>]
用正则查询

第九种:
>>> Person.objects.filter(name__iregex="^J")
[<Person: Jun>, <Person: jlon>]
不区分大小写的正则查询

第十种:
>>> Person.objects.exclude(name__contains="n")
[<Person: ET>, <Person: GG>]
排除所有带n的对象,不区分大小写

第十一种:
>>> Person.objects.filter(name__contains="j").exclude(age=18)
[<Person: Jun>]
找出所有带j的对象,但是排除年龄18的

查询实例:
修改mytest\test1\veiws.py
#coding:utf-8
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from django.core.urlresolvers import reverse
from .forms import AddForm
from .models import Person

def index(request):
return HttpResponse("hello world 你好")

def add(request):
name = Person.objects.filter(name__contains="j").exclude(age=18)[0].name
age = Person.objects.filter(name__contains='j').exclude(age=18)[0].age
return HttpResponse(str(name)+'\t'+str(age))
先导入模型再查询

urls.py不变
url(r'^add/$',test1_views.add,name='add'),



django数据表更改
1.7以后只要执行下面两条数据
python manage.py makemigrations
python manage.py migrate
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: