Django 之 (6)模型(数据库)
2017-05-22 20:20
246 查看
Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django
支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。
一、 基本用法
1、修改models.py文件,我们先新建一个Person类,继承自models.Model, 一个人有姓名和年龄。
这里用到了两种Field,更多Field类型可以参考教程链接:https://docs.djangoproject.com/en/dev/ref/models/fields/
2、创建数据表
两个命令:
3、使用Django提供的QuerySet API
3.1 创建一个对象有一下几种方法:
Person.objects.create(name=name,age=age)
p = Person(name="WZ", age=23)
p.save()
p = Person(name="TWZ")
p.age = 23
p.save()
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
3.2 获取对象的方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.get(name=name) #获取单个对象
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
说明: = 表示精确匹配,字段后加双下划线,则contais部分会被翻译成LIKE
12. 对任意字段排序: Person.object.order_by("address")
如果是逆向排序,则在address前面加一个减号-前缀
说明:如果在Model.py 的Person类中添加如下代码,则表示,使用Django的数据库API检索时,返回值都会按照name字段排序:
$ python manage.py inspectdb
通过Model类生成MySQL语句:
$ python manage.py sqlall app_name
检查模型语法和逻辑是否正确:
$ python manage.py validate
提交sql语句至数据库:
$ python manage.py syncdb
进入数据库:
$ python manage.py dbshell
def get_result_by_task_id(task_id):
print str(models.MetricsResult.objects.filter(task_id=task_id).query)
return models.MetricsResult.objects.filter(task_id=task_id)
group by 的用法
UserData.objects.filter(hubid=sensorid,time__range=(time2,time1)).values('hour').annotate(sum_out=Sum('outdoor'), sum_in=Sum('indoor'), sum_eat=Sum('kitchen'), sum_wash=Sum('toilet')).order_by('hour')
上述代码相当于:
其他一下models用法:
http://www.cnblogs.com/wspblog/p/6358819.html
支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。
一、 基本用法
1、修改models.py文件,我们先新建一个Person类,继承自models.Model, 一个人有姓名和年龄。
from django.db import models class Person(models.Model): name = models.CharField(max_length=30) age = models.IntegerField()
这里用到了两种Field,更多Field类型可以参考教程链接:https://docs.djangoproject.com/en/dev/ref/models/fields/
2、创建数据表
两个命令:
# Django 1.7 及以上的版本需要用以下命令 python manage.py makemigrations python manage.py migrate
3、使用Django提供的QuerySet API
3.1 创建一个对象有一下几种方法:
Person.objects.create(name=name,age=age)
p = Person(name="WZ", age=23)
p.save()
p = Person(name="TWZ")
p.age = 23
p.save()
Person.objects.get_or_create(name="WZT", age=23)
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
3.2 获取对象的方法:
Person.objects.all()
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
Person.objects.get(name=name) #获取单个对象
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc") # 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
说明: = 表示精确匹配,字段后加双下划线,则contais部分会被翻译成LIKE
12. 对任意字段排序: Person.object.order_by("address")
如果是逆向排序,则在address前面加一个减号-前缀
说明:如果在Model.py 的Person类中添加如下代码,则表示,使用Django的数据库API检索时,返回值都会按照name字段排序:
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']**
3.3 一些命令
通过已有数据库创建Model类:$ python manage.py inspectdb
通过Model类生成MySQL语句:
$ python manage.py sqlall app_name
检查模型语法和逻辑是否正确:
$ python manage.py validate
提交sql语句至数据库:
$ python manage.py syncdb
进入数据库:
$ python manage.py dbshell
3.4 一些语法
查看models 对应的sql语句:(用query)def get_result_by_task_id(task_id):
print str(models.MetricsResult.objects.filter(task_id=task_id).query)
return models.MetricsResult.objects.filter(task_id=task_id)
group by 的用法
UserData.objects.filter(hubid=sensorid,time__range=(time2,time1)).values('hour').annotate(sum_out=Sum('outdoor'), sum_in=Sum('indoor'), sum_eat=Sum('kitchen'), sum_wash=Sum('toilet')).order_by('hour')
上述代码相当于:
select Sum('outdoor') as sum_out,Sum('indoor') as sum_in,Sum('kitchen') as sum_eat,Sum('toilet') as sum_wash,hour where hubid='sensorid' and (time between time1 and time2) group by hour order by hour asc
其他一下models用法:
http://www.cnblogs.com/wspblog/p/6358819.html
相关文章推荐
- django官方文档——模型与数据库
- The Django Book【第5章 与数据库交互:模型】
- django模型到数据库的映射
- Django--model模型绑定_数据库操作
- Django数据模型动态增删字段(更改数据库模式)
- django-evolution 插件维持Django 模型和数据库结构一致的基本原理
- django的数据库模型中的域多次引用同一个外键(表)
- 通过数据库向Django模型添加字段的示例
- django 模型model与数据库2——函数
- Django,数据模型创建之数据库API参考
- models.py---Django中的数据库模型
- Django模型-数据库操作
- 通过数据库对Django进行删除字段和删除模型的操作
- Django项目实践3 - Django模型(view-数据库)
- django python query Making queries -- 模型的数据库查询 good
- 认识django2.0读书笔记(5)---第五章 模型(django数据库层)
- Django中的模型与数据库(Models and database)
- 我的django之旅(三)数据库和模型
- django 模型model与数据库3——高级操作(外联,多对多,修改字段)