日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django--ORM操作

發(fā)布時(shí)間:2025/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django--ORM操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ORM操作:

mysql> create database django_db charset utf8; ?特別提示MYSQL數(shù)據(jù)庫必須先創(chuàng)建數(shù)據(jù)庫
Query OK, 1 row affected (0.03 sec)

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

設(shè)置數(shù)據(jù)庫表:多對多字段設(shè)置默認(rèn)值為空時(shí)--無效
WARNINGS:
bbs.Article.tags: (fields.W340) null has no effect on ManyToManyField.

創(chuàng)建超級用戶:弱密碼校測(8位以上)zhangsong/1q2w3e!@#
D:\python培訓(xùn)\our_python\demo_django_server>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培訓(xùn)\our_python\demo_django_server>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第一個(gè)
objects.last最后一個(gè)
objects.filter返回列表
objects.all返回對象列表
objects.get 返回單個(gè)對象或者錯(cuò)誤(DoesNotExist不存在錯(cuò)誤、MultipleObjectsReturned返回多個(gè)對象的錯(cuò)誤)
objects.get_or_create 返回False表示查詢對象存在未創(chuàng)建,返回True表示查詢對象不存在并成功創(chuàng)建,返回IntegrityError表示不存在,但創(chuàng)建時(shí)數(shù)據(jù)不完善造成創(chuàng)建失敗
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)有外鍵時(shí)先創(chuàng)建外鍵:外鍵不能為空(數(shù)據(jù)庫會(huì)默認(rèn)創(chuàng)建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)含有多對多字段的表新增數(shù)據(jù)、必須先創(chuàng)建對應(yīng)的對象,最后插入多對多的字段(其他字段先創(chuàng)建、最后補(bǔ)增多對多字段)
models.Book.objects.create(name='math',price=12,pub_date='2013-12-12',publisher_id=1,authors_id=1)#authors為多對多字段
多對多報(bào)錯(cuò):
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) #創(chuàng)建對象
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這個(gè)對象關(guān)聯(lián)的外鍵的記錄中的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不存在則創(chuàng)建,返回值True表示已經(jīng)創(chuàng)建,False表示未創(chuàng)建
>>> 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 結(jié)束
__range 范圍
__isnull 為空
__regex 正則表達(dá)式
__iregex 正則表達(dá)式 忽略大小寫

>>> 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(聚合)
聚合操作:(不統(tǒng)計(jì)包含null的數(shù)據(jù))
>>> 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聚合統(tǒng)計(jì)
>>> 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語句:
批量更新數(shù)據(jù)庫
>>> 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}]>

(數(shù)據(jù)遷移)將同一個(gè)表的某一個(gè)字段的值,全部傳給另一個(gè)字段
>>> from django.db.models import F
>>> from app01 import models
>>> models.Book.objects.update(memo=F("price")) --->將price字段的值全部賦值給memo字段

(數(shù)據(jù)比較)同一個(gè)表不同字段進(jìn)行比較
>>> from django.db.models import F
>>> models.Book.objects.filter(memo__gt=F('price'))

?

?form表單

后端生成前端需要的數(shù)據(jù)和樣式,前端僅負(fù)責(zé)調(diào)用并展示--->

app中建forms表單(創(chuàng)建位置沒有要求,能找到即可),在forms中建一個(gè)類(AmForm),類中寫明具體返回的字段名稱和樣式;
views視圖中導(dǎo)入視圖(from app01.froms import forms并實(shí)例化,form = AmForm(),并以參數(shù)(字典)的形式傳給前端);
前端輸入數(shù)據(jù)給后端,先提交給表單驗(yàn)證,將數(shù)據(jù)提交給表單form = AmForm(request.POST),驗(yàn)證數(shù)據(jù)合法性form.is_valid(),驗(yàn)證后的數(shù)據(jù)傳給cleaned_data屬性進(jìn)行格式化數(shù)據(jù)(form.cleaned_data),驗(yàn)證失敗的錯(cuò)誤放入form.errors中;
(樣式和邏輯驗(yàn)證全部在app下的forms文件中添加);
樣式添加在attrs字段中,格式為字典;
自定義邏輯驗(yàn)證,增加clean_colname(colname為字段名稱)的函數(shù),并在函數(shù)中驗(yàn)證,驗(yàn)證完返回驗(yàn)證的字段,否則后端業(yè)務(wù)拿到數(shù)據(jù)為None;

?

轉(zhuǎn)載于:https://www.cnblogs.com/feiyu_Team/p/6654220.html

總結(jié)

以上是生活随笔為你收集整理的Django--ORM操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。