`

django(5):数据库模型models

 
阅读更多

创建学生类

 

vim app0904/models.py

from __future__ import unicode_literals

from django.db import models

# Create your models here.



class Student(models.Model):
  id = models.IntegerField(primary_key=True)
  name = models.CharField(max_length=50)
  age=models.IntegerField()
  sex=models.IntegerField()
  class Meta:
    db_table='student'

 同步数据库

 

 

[root@localhost project0904]# python manage.py makemigrations 
Migrations for 'app0904':
  app0904/migrations/0001_initial.py:
    - Create model Student
[root@localhost project0904]# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app0904, auth, contenttypes, sessions
Running migrations:
  Applying app0904.0001_initial... OK

 插入几个测试的Student

 

 

 

[root@localhost project0904]# python manage.py shell
Python 2.7.5 (default, Jun 17 2014, 18:11:42) 
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 
>>> 
>>> 
>>> from app0904.models import Student
>>> Student.objects.create(id=1,name='zhangsan',age=11,sex=0)  
<Student: Student object>
>>> Student.objects.all()
<QuerySet [<Student: Student object>]>
>>> Student.objects.all().get(id=1)
<Student: Student object>
>>> Student.objects.all()[0].id
1
>>> Student.objects.all()[0].name
u'zhangsan'
>>> 
>>> 
>>> Student.objects.create(id=2,name='lisi',age=12,sex=0)    
<Student: Student object>

 创建测试模版

 

 

from django.shortcuts import render
from app0904.models import Student



def student_list(request):
  #studentList=Student.objects.all()#所有学生
  #studentList=Student.objects.order_by('-age','id')#年龄倒序 id排序
  studentList=Student.objects.filter(age__gte=11)#年龄大于11
  return render(request,'student_list.html', {'studentList':studentList})

 修改URLs.py

 

[root@localhost project0904]# vim project0904/urls.py

from django.conf.urls import url
from django.contrib import admin
from app0904 import views
urlpatterns=[
url(r'^$',views.main),
url(r'^admin/',admin.site.urls),
url(r'^studentlist/$',views.student_list),




url(r'^hello/$',views.hello),
url(r'^hellop1/(.+)/$',views.helloParam),
url(r'^hello/(.+)/(.+)/$',views.helloParams),
url(r'^hellopp/',views.helloPar)]

 

创建html文件

[root@localhost templates]# pwd
/root/project0904/app0904/templates
[root@localhost templates]# vim student_list.html


{% extends 'base.html' %}

{% block title%}studentlist{%endblock%}

{% block content%}

{%for student in studentList%}

<li>{{student.id}},{{student.name}},{{student.age}},{{student.sex}}</li>
{%empty%}
sorry
{% endfor %}

{% endblock %}

 

 

django ORM model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

 

1.多表连接查询:感觉django太NX了。
  class A(models.Model):
    name = models.CharField(u'名称')
  class B(models.Model):
    aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')

1.5 反向查询,补上记录1.5,感觉django太太太NX了。
  class A(models.Model):
    name = models.CharField(u'名称')
  class B(models.Model):
    aa = models.ForeignKey(A,related_name="FAN")
    bb = models.CharField(u'名称')
  查A: A.objects.filter(FAN__bb='XXXX'),都知道related_name的作用,A.FAN.all()是一组以A为外键的B实例,可前面这样的用法是查询出所有(B.aa=A且B.bb=XXXX)的A实例,然后还可以通过__各种关系查找,很好用!!!

2.条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct() 去重复
__exact 精确等于 like 'aaa'
 __iexact 精确等于 忽略大小写 ilike 'aaa'
 __contains 包含 like '%aaa%'
 __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False

例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>> q3 = q1.filter(pub_date__gte=datetime.date.today())
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")

即q1.filter(pub_date__gte=datetime.date.today())表示为时间>=now,q1.exclude(pub_date__gte=datetime.date.today())表示为<=now

2013/12/12补充:
“在django models中取得一个字段的distinct值”。就是select distinct xxx from table_name ...这样的功能。使用values会生成ValuesQuerySet(形如N个dict组成的list),猜测大数据无额外性能影响,毕竟queryset系列都是使用时才查询操作的。
xxxx.objects.values("field_name").distinct()
#或者
xxxx.objects.distinct().values("field_name")
这两句生成的sql语句相同

关于缓存:
queryset是有缓存的,a = A.objects.all(),print [i for i in a].第一次执行打印会查询数据库,然后结果会被保存在queryset内置的cache中,再执行print的时候就会取自缓存。
很多时候会遇到仅需判断queryset是否为空的情况,可以1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 三种方式性能依次提升。
当queryset非常巨大时,cache会成为问题。此时可以queryset.iterator(),迭代器的用处就不多说了,根据具体需求情况使用。

 

 

添加一行数据1
add = myclass(aa='wahaha',bb='hahawa' )
add.save() #不save无法保存到数据库
add.id #获取增加的这条数据的ID
添加一行数据2
myclass.objects.create(aa='wahaha',bb='hahawa')  # 同上1方法一样无需保存save
 
 
删除表中全部数据
myclass.objects.all().delete()
删除一条aa等于'test'的数据
myclass.objects.get(aa='test').delete()
删除多条数据
myclass.objects.filter(aa='123').delete() #过滤出aa字段等于123的都删除
 
查出库中所有条数的数据
myclass.objects.all()
查询带字段名的所有条数数据
myclass.objects.all().values()
查询单挑数据
myclass.objects.get(aa='123') #查询aa字段中是123的这条数据,如果是多条和没有的时候会报错,尽量结合try:except使用 
查询匹配条件的多条数据
myclass.objects.filter(aa='123') #查询aa字段值为123的所有数据条数,括号的匹配条件可多个,以逗号分隔
模糊查询
myclass.objects .filter(aa__contains="1") #查询aa字段中值包含'1'的数据,例如aa字段值为 123 154 这两条都能匹配
根据字段内容排序后展示数据
myclass.objects.order_by('aa')  #根据aa字段的内容进行数据排序,会根据字母和数字排序
根据字段内容逆向排序后展示数据,加一个负号
 
myclass.objects .order_by('-aa' )  #根据aa字段的内容进行逆向数据排序,会根据字母和数字排序
连锁查询,先过滤,过滤后进行逆向排序
 

myclass.objects.filter(aa='123'.order_by("‐aa")

限制数据条数,相当于mysql limit
myclass.objects.filter(aa='123')[0]  #[0]显示第一条 [0:2]会显示前两条
myclass.objects.filter(aa='123').order_by("‐aa")[0] #切片不支持负数,这样就数据序列倒过来的第一条,也就是最后一条数据 

 
更新数据
a = userinfo.objects.get(cellPhone='13133333333') #查询一条你要更新的数据
a.cellPhone='3111111111111'   #赋值给你要更新的字段
a.save() #保存
更新多个字段或一个字段
myclass.objects .get(aa='123').update(aa='321',bb="wahaha") #update可多条
更新所有字段

 

myclass.objects.all().update(aa='8888') #更新所有字段,更新后会显示受影响的条数
 
Student.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
 
get获取满足条件的一些人用filter
 
Student.objects.filter(name="abc") # 等于Student.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
 
Student.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
 
 
 
Student.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
 
Student.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
 
 
 
Student.objects.filter(name__regex="^abc") # 正则表达式查询
 
Student.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写

 

 

分享到:
评论

相关推荐

    解决django同步数据库的时候app models表没有成功创建的问题

    在使用Django框架开发Web应用时,数据库的同步是一个常见且重要的操作,它确保数据库结构与我们的应用程序中定义的模型保持一致。Django通过迁移(migrations)的方式,自动跟踪模型的改动,并将这些改动应用到...

    凝思系统+django+达梦数据库

    在Django应用的`models.py`文件中定义数据模型,这将映射到达梦数据库的表结构。利用Django的ORM(对象关系映射)进行数据库操作。 7. **数据库迁移**: 运行`python manage.py makemigrations`生成迁移文件,...

    7. Django 模型与数据库

    "Django模型与数据库"这个主题是Django核心概念中的关键部分,主要涉及如何通过Django来设计、操作和管理数据库。在这个主题中,我们将深入探讨Django模型的定义、数据库操作以及与数据库的交互方式。 首先,Django...

    python建站django框架与数据库交互的简单学习代码

    在Python的Web开发领域,Django框架以其高效、安全和易于...在实际项目中,你可能需要处理更复杂的业务逻辑,如分页、过滤、排序等,但这些基本操作是Django数据库交互的基础。记得在学习过程中不断实践,以加深理解。

    浅谈Django中的数据库模型类-models.py(一对一的关系)

    from django.db import models # Create your models here. # 一对一关系:数据库中两个表中数据的对应关系 # 一个账户对应着一个联系人,而一个联系人有一个账户 # 一对一关系是通过在两个表之间定义相同的主键来...

    Django(三)模型与数据库

    在Python的Web开发框架Django中,模型是与数据库交互的核心组件。模型定义了数据的结构,包括字段、类型和关系。本章我们将深入探讨Django的模型与数据库的使用,特别是结合MySQL数据库的应用。 首先,Django模型是...

    Django框架基础教程(一):简单介绍PythonDjango框架.pdf

    - **models.py**:定义数据模型,与数据库交互。 - **forms.py**:处理HTML表单,包括数据验证和表单生成。 - **templates**文件夹:存放HTML模板,与views.py中的函数配合,动态生成网页。 - **admin.py**:...

    django教程:基本操作笔记整理.rar

    这个教程将带你深入了解Django的基本操作,包括安装、项目创建、应用构建、数据库交互以及视图和模板的使用。让我们一一探讨这些关键知识点。 **一、安装Django** 在开始之前,确保你已经安装了Python。然后,通过...

    Django数据库内省工具通过数据表名就可以动态创建一个即时可用的Djangomodels对象

    本篇文章将详细讲解如何利用Django的数据库内省(Introspection)工具,通过已有的数据表名动态创建Django Models对象,以便快速地与数据库进行交互。 首先,Django的数据库内省工具是其ORM(Object-Relational ...

    Python-Django模型字段加密解密您的数据并加密保存至数据库中

    默认情况下,Django将模型字段的值作为明文存储在数据库中。为了加密这些字段,我们需要自定义字段类,或者使用已有的第三方库。 luojilab-django-mirage-field-5d96836是一个这样的库,它提供了一种简单的方法来...

    Django读取Mysql数据并显示在前端的实例

    总结一下,这个实例展示了如何在Django中连接MySQL数据库,创建模型,同步数据库,定义视图,设置URL路由,以及在模板中显示数据。这个过程是Django进行数据驱动开发的基础,可以帮助你构建复杂的数据展示和交互功能...

    django-postgresql 数据库驱动

    **Django PostgreSQL数据库驱动详解** 在Python的Web开发框架Django中,PostgreSQL是一种常用的高性能关系型数据库。PostgreSQL以其强大的功能、稳定性以及对复杂查询的良好支持,深受开发者喜爱。而将Django与...

    python使用Django库向mysql数据库插入数据

    这个过程涵盖了使用Python Django框架与MySQL数据库交互的基本步骤,包括模型定义、数据库配置、视图函数创建、HTML表单以及URL路由。对于初学者或有一定基础的开发者来说,这是一个很好的实践项目,有助于理解Web...

    PythonDjango支持像PostgresCitus这样的分布式多租户数据库

    在Django模型中,我们可以创建一个公共模型基类,包含这个标识符字段,然后让其他模型继承这个基类。 例如: ```python from django.db import models class TenantMixin(models.Model): tenant_id = models....

    django博客项目(数据库使用mysql)+带后台

    - 在 `myblog/app/models.py` 文件中,创建 BlogPost 模型,包括标题(title)、内容(content)、作者(author)等字段。 - 运行 `python manage.py makemigrations` 和 `python manage.py migrate` 命令,为模型...

    Django官方文档中文翻译(models部分)

    在这个“Django官方文档中文翻译(models部分)”中,我们将会深入探讨Django的核心组件之一——模型(Models),它是数据层的核心,用于定义数据库结构和业务逻辑。 一、模型(Models)基础 1. 定义模型:模型是...

    python基于人脸识别的酒店客房入侵检测系统(django)源码数据库演示.zip

    - `models.py`:定义数据库模型。 - `views.py`:处理HTTP请求,与视图逻辑相关。 - `urls.py`:定义URL路由,连接视图函数和前端页面。 - `settings.py`:项目配置,包括数据库连接、中间件、应用设置等。 - `...

    Python-Django与MongoDB数据库的连接器

    在这个例子中,Djongo会自动处理将Django模型转换为MongoDB的文档,并在数据库中创建对应的集合。 在处理查询时,Django的QuerySet API仍然适用,但要注意某些SQL特性可能不适用于MongoDB,因为它们具有不同的查询...

    django 连接数据库、上传文件

    3. **创建数据库表**:运行Django的数据库迁移命令,以根据你的应用模型创建表: ``` python manage.py makemigrations python manage.py migrate ``` 接下来,我们讨论Django中的文件上传功能。Django提供了...

    python普通话学习平台(django)源码数据库演示.zip

    6. **models.py**:数据库模型,定义应用程序的数据结构。 7. **static** 和 **media** 目录:分别用于存放静态资源(如CSS、JavaScript)和用户上传的媒体文件。 8. **templates** 目录:包含HTML模板,用于渲染...

Global site tag (gtag.js) - Google Analytics