Django--ORM操作

ORM操作:

mysql> create database django_s20 charset utf8;  特别提示MYSQL数据库必须先创建数据库
Query OK, 1 row affected (0.03 sec)

https://docs.djangoproject.com/en/1.10/

设置数据库表:多对多字段设置默认值为空时--无效
WARNINGS:
bbs.Article.tags: (fields.W340) null has no effect on ManyToManyField.

创建超级用户:弱密码校测(8位以上)zhangsong/[email protected]#
D:\python培训\our_python\s15_django_20>python manage.py createsuperuser
System check identified some issues:
WARNINGS:
bbs.Article.tags: (fields.W340) null has no effect on ManyToManyField.
Username (leave blank to use ‘admin‘): zhangsong
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
Password:
Password (again):
Superuser created successfully.

D:\python培训\our_python\day20_django>python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>>>> from app01 import models

CRUD---create、revise、update、delete增删改查
objects.create
b1 = app01.models.Book(name="linux"...)
b1.save()
objects.update
objects.first第一个
objects.last最后一个
objects.filter返回列表
objects.all返回对象列表
objects.get 返回单个对象或者错误(DoesNotExist不存在错误、MultipleObjectsReturned返回多个对象的错误)
objects.get_or_create 返回False表示查询对象存在未创建,返回True表示查询对象不存在并成功创建,返回IntegrityError表示不存在,但创建时数据不完善造成创建失败
objects.delete

新增:
>>> models.Publisher.objects.create(name=‘qinghua‘,website="http://qinghua.edu.com.cn")
<Publisher: qinghua>
>>> models.Publisher.objects.create(name=‘youdian‘,website="http://youdian.edu.com.cn")
<Publisher: youdian>

(1)有外键时先创建外键:外键不能为空(数据库会默认创建ID字段publisher_id=1表示publisher表的id为1的一行记录)
jango.db.utils.IntegrityError: NOT NULL constraint failed: app01_book.publisher_id
>>> models.Book.objects.create(name=‘math‘,price=12,pub_date=‘2013-12-12‘,publisher_id=1)
<Book: math>
>>> models.Book.objects.create(name=‘wu‘,price=12,pub_date=‘2013-12-12‘,publisher_id=1)
<Book: wu>
>>> models.Book.objects.create(name=‘le‘,price=32,pub_date=‘2003-12-12‘,publisher_id=2)
<Book: le>

(2)含有多对多字段的表新增数据、必须先创建对应的对象,最后插入多对多的字段(其他字段先创建、最后补增多对多字段)
models.Book.objects.create(name=‘math‘,price=12,pub_date=‘2013-12-12‘,publisher_id=1,authors_id=1)#authors为多对多字段
多对多报错:
ValueError: "<Book: math>" needs to have a value for field "book" before this many-to-many relationship can be used.
obj = models.Book.objects.create(name=‘math‘,price=12,pub_date=‘2013-12-12‘,publisher_id=1) #创建对象
obj.authors.add(1,2) #对象中增添authors字段并赋值
obj.authors.remove(1,2) #对象中删除authors字段
obj.save() #保存

查询:
外键查询:publisher为外键
obj = models.Book.objects.create(name=‘math‘,price=12,pub_date=‘2013-12-12‘,publisher_id=1)
obj.publisher.name #即可查出obj这个对象关联的外键的记录中的name字段的值
>>> obj.publisher.name
‘qinghua‘
查询部分字段:
>>> models.Book.objects.values("name","price")
<QuerySet [{‘name‘: ‘python‘, ‘price‘: 12}, {‘name‘: ‘linux‘, ‘price‘: 122}, {‘name‘: ‘java‘, ‘price‘: None}]>

get不存在:
app01.models.DoesNotExist: Book matching query does not exist.

get_or_create不存在则创建,返回值True表示已经创建,False表示未创建
>>> models.Book.objects.get_or_create(name=‘java‘,publisher_id=1,pub_date="2011-03-15")
(<Book: java>, True)
>>> models.Book.objects.get_or_create(name=‘java‘)
(<Book: java>, False)

__contains包含
__icontains包含 忽略大小写
__startswith 开始
__endswith 结束
__range 范围
__isnull 为空
__regex 正则表达式
__iregex 正则表达式 忽略大小写

>>> models.Book.objects.filter(name__contains=‘java‘)
<QuerySet [<Book: java>]>
>>> models.Book.objects.filter(name__contains=‘jAva‘)
<QuerySet []>
>>> models.Book.objects.filter(name__icontains=‘jAva‘)
<QuerySet [<Book: java>]>

>>> models.Book.objects.filter(pub_date__range=("2011-01-01","2222-01-01"))
<QuerySet [<Book: python>, <Book: linux>, <Book: java>]>
>>> models.Book.objects.filter(pub_date__year=2011)
<QuerySet [<Book: java>]>

>>> models.Book.objects.filter(pub_date__isnull=False)
<QuerySet [<Book: python>, <Book: linux>, <Book: java>]>
>>> models.Book.objects.filter(pub_date__isnull=True)
<QuerySet []>

取反操作:
>>> models.Book.objects.exclude(price=None) #查询所有price不为空的对象
<QuerySet [<Book: python>, <Book: linux>]>

Aggregation(聚合)
聚合操作:(不统计包含null的数据)
>>> from django.db.models import Avg,Max,Min,Sum,Count
>>> models.Book.objects.all().count()
3
>>> models.Book.objects.all().aggregate(Sum("price"))
{‘price__sum‘: 134}
>>> models.Book.objects.all().aggregate(Avg("price"))
{‘price__avg‘: 67.0}

>>> models.Book.objects.all().aggregate(Max("price"))
{‘price__max‘: 122}
>>> models.Book.objects.all().aggregate(Min("price"))
{‘price__min‘: 12}

values后面跟分类的名称、annotate聚合统计
>>> models.Book.objects.values("publisher__name").annotate(Count("id"))
<QuerySet [{‘id__count‘: 3, ‘publisher__name‘: ‘qinghua‘}, {‘id__count‘: 2, ‘publisher__name‘: ‘youdian‘}]>

# The top 5 publishers, in order by number of books.
>>> pubs = models.Publisher.objects.annotate(num_books=Count(‘book‘)).order_by(‘-num_books‘)[:5]
>>> pubs[0].num_books
1323

output_field指定输出格式
>>> from django.db.models import F, FloatField, Sum
>>> Book.objects.all().aggregate(price_per_page=Sum(F(‘price‘)/F(‘pages‘), output_field=FloatField()))
{‘price_per_page‘: 0.4470664529184653}

其他操作:https://docs.djangoproject.com/en/1.9/topics/db/aggregation/

Q语句:
>>> from django.db.models import Q
>>> q1 = Q(pub_date__year="2016")
>>> q2 = Q(pub_date__year="2016") | Q(pub_date__year="2018")
>>> q3 = Q(pub_date__year="2016") | ~Q(pub_date__year="2018")
>>> q4 = Q(pub_date__year="2016") , Q(pub_date__year="2018")
>>> q1
<Q: (AND: (‘pub_date__year‘, ‘2016‘))>
>>> q2
<Q: (OR: (‘pub_date__year‘, ‘2016‘), (‘pub_date__year‘, ‘2018‘))>
>>> q3
<Q: (OR: (‘pub_date__year‘, ‘2016‘), (NOT (AND: (‘pub_date__year‘, ‘2018‘))))>
>>> q4
<Q: (AND: (‘pub_date__year‘, ‘2016‘),(AND: (‘pub_date__year‘, ‘2018‘)))>
>>> models.Book.objects.filter(q3)
<QuerySet [<Book: python>, <Book: linux>, <Book: java>]>

F语句:
批量更新数据库
>>> from django.db.models import F
>>> from app01 import models
>>> models.Book.objects.values("price")
<QuerySet [{‘price‘: 12}, {‘price‘: 12}, {‘price‘: 32}, {‘price‘: 12}, {‘price‘: 22}]>
>>> models.Book.objects.update(price=F("price")+15)
5
>>> models.Book.objects.values("price")
<QuerySet [{‘price‘: 27}, {‘price‘: 27}, {‘price‘: 47}, {‘price‘: 27}, {‘price‘: 37}]>

(数据迁移)将同一个表的某一个字段的值,全部传给另一个字段
>>> from django.db.models import F
>>> from app01 import models
>>> models.Book.objects.update(memo=F("price")) --->将price字段的值全部赋值给memo字段

(数据比较)同一个表不同字段进行比较
>>> from django.db.models import F
>>> models.Book.objects.filter(memo__gt=F(‘price‘))

 form表单

后端生成前端需要的数据和样式,前端仅负责调用并展示--->

app中建forms表单(创建位置没有要求,能找到即可),在forms中建一个类(AmForm),类中写明具体返回的字段名称和样式;
views视图中导入视图(from app01.froms import forms并实例化,form = AmForm(),并以参数(字典)的形式传给前端);
前端输入数据给后端,先提交给表单验证,将数据提交给表单form = AmForm(request.POST),验证数据合法性form.is_valid(),验证后的数据传给cleaned_data属性进行格式化数据(form.cleaned_data),验证失败的错误放入form.errors中;
(样式和逻辑验证全部在app下的forms文件中添加);
样式添加在attrs字段中,格式为字典;
自定义逻辑验证,增加clean_colname(colname为字段名称)的函数,并在函数中验证,验证完返回验证的字段,否则后端业务拿到数据为None;

时间: 2024-10-26 08:45:54

Django--ORM操作的相关文章

Django ORM操作及进阶

Django ORM操作及进阶 一.常规操作 1.必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误. <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> values(*field):

django ORM 操作

data models sample: from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): # __unicode__ on Python 2 return self.name class Author(models.Model): name = models.Ch

Django ORM操作数据库常用API

昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进行学习 1.构造数据表 把以下内容,拷贝到你的朋友charm中,然后执行migrate命令 class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField() def __str__

python学习笔记-Day022 - django ORM操作

一对多:models.ForeignKey() 首先定义表结构: class UserType(models.Model):     caption = models.CharField(max_length=32)     def __unicode__(self):         return self.caption          class UserInfo(models.Model):     username = models.CharField(max_length=32)

Django ORM操作的几个细节

1. __gte: 大于等于 Book.objects.filter(price__gt=100) # 查询price大于等于100的记录 2. __range: 顾头也顾尾,相当于between...and... Book.objects.filter(price__range=[100,200]) # 查询price在100和200之间的记录 原文地址:https://www.cnblogs.com/zzliu/p/10535346.html

Python学习---抽屉框架分析[ORM操作]180314

Django ORM操作     1. 字段操作         class User(model.Model);             u=字段        用处:            1 .admin中的字段验证            2. obj.clean_fields() 进行自定义的验证             3. 利用Djanfo Form进行验证,此时前台和后台的操作分开               但form和model里的字段重复[推荐使用]             

Python/Django(CBA/FBA/ORM操作)

Python/Django(CBA/FBA/ORM操作) CBA:url对应的类(模式) 1 ##====================================CBA操作============================ 2 3 # class geting(View): 4 # def dispatch(self, request, *args, **kwargs): 5 # print('before') 6 # obj = super(geting,self).dispat

Django 数据库ORM操作

CMDB实现数据展示功能部分代码. views.py def asset(request):     asset = Asset.objects.all()     return render_to_response("asset.html",{'asset': asset})      models.py class Asset(models.Model):     ipaddr = models.CharField(max_length=20, verbose_name=u'IP地

Django入门 &#160; 数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.

Django之ORM操作(***)

Django之ORM操作(***) 生成数据库: python manage.py makemigrations python manage.py migrate 常用命令: python manage.py runserver 0.0.0.0 python manage.py startapp appname python manage.py syncdb 创建superuser:python manage.py createsuperuser 在项目名中的__init__ .py 加: im