django学习笔记5:模型
2016-06-30 22:11
549 查看
Django模型(数据库)
修改mytest\mytest\settings.py
根据不同的数据库连接填不同的内容(这里以sqlite3为例)
mysql配置:
进入app中修改mytest\test1\models.py
执行命令:
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
urls.py不变
url(r'^add/$',test1_views.add,name='add'),
django数据表更改
1.7以后只要执行下面两条数据
python manage.py makemigrations
python manage.py migrate
修改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
相关文章推荐
- django学习笔记4:模版
- moongoose对象无法新增删除属性
- django学习笔记3:视图与路由
- django学习笔记2:基本命令
- django学习笔记1:安装
- 怎样一开始打开activity就启动google的下拉刷新(仿优酷的下拉刷新)
- Django搭建简易博客教程(二)
- beego任务定时执行,延迟执行
- 腾讯云、极益为NGO提供免费公益云服务和开源应用
- 依赖管理工具漫谈--从Maven,Gradle到Go
- Polygon Collider 2D无法编辑的问题
- Django搭建简易博客教程(一)
- Django表单
- googlecodejam.Qualification Round Africa 2010.Problem A. Store Credit
- CodeForces 559A Gerald's Hexagon
- Google Analytics跳转页面跳转量的检测
- django 1.9.7学习笔记(1)
- BAPI for goods receipt for subcontracting PO
- BAPI_GOODSMVT_CREATE for subcontracting PO
- Django基础