django知識點總結
一、檢視函式:
請求物件-----------request:
1、HttpRequest.body: 請求原資料
2、HttpRequest.path: 一個字串,表示請求的路徑元件(不含域名)
3、HttpRequest.method
4、HttpRequest.GET
5、HttpRequest.POST
6、HttpRequest.FILES
7、HttpResquest.user: 一個AUTH_USER_MODEL 型別的物件
響應物件:
return HttpResponse("") 返回字串例項
return render(request,"template",{"":""}) 返回字串例項
return rredirect("/index/") 重定向
二、 模板語言
首先在views檢視函式里寫函式,返回一個渲染頁面:
views:
def foo (request):
name="li"
l=[111,2222,3333]
d={"info":[obj1,obj2...]}
return render(request,"index.html",locals())
1、變數:{{name}}
-------深度查詢 句點符. 如:{{d.info.0.name}}
-------過濾器{{name|date:"Y-m-d"}}
2.標籤:
for迴圈
{%for i in l%}
{{i}}
{%empty%}
<p>沒有符合的條件</p>
{%endfor%}
if判斷語句
{%if name="li"%}
<p> Yes</p>
{%elif%}
{%endif....%}
3、模板語法
(1)在母版中base.html: {%block con%}{%endblock%}
(2)繼承母版 index.html:
{%extends "base.html"%} 繼承
{%block con%}
{%endblock%}
三、ORM之models模型
1、 對映關係:
sql中表名-----------Python的類名
sql中的欄位---------Python的類屬性
sql中的記錄---------Python的類物件
2、單表操作
class Article(models.Model):
nid = models.BigAutoField(primary_key=True)
title = models.CharField(max_length=50, verbose_name='文章標題')
read_count = models.IntegerField(default=0)
(1)新增操作
views:
複製程式碼
#方法1:
article_obj=models.Article.objects.create(nid=1,title="yuan",read_count=12) # create方法返回的是當前建立的文章物件
#方法2:
article_obj=models.Article(nid=1,title="yuan",read_count=12)
article_obj.save()
刪除:
models.Article.objects.filter(title="python").delete() # 預設級聯刪除
修改:
models.Article.objects.filter(title="python").update(read_count=F("read_count")+10)
查詢API:
<1> all(): 查詢所有結果 #QuerySet
<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的物件 #QuerySet
<3> get(**kwargs): 返回與所給篩選條件相匹配的物件,返回結果有且只有一個,
如果符合篩選條件的物件超過一個或者沒有都會丟擲錯誤。# model物件
<5> exclude(**kwargs): 它包含了與所給篩選條件不匹配的物件 #QuerySet
<4> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,執行後得到的並不是一系列
model的例項化物件,而是一個可迭代的字典序列 #QuerySet
<9> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 #QuerySet
<6> order_by(*field): 對查詢結果排序 #QuerySet
<7> reverse(): 對查詢結果反向排序 #QuerySet
<8> distinct(): 從返回結果中剔除重複紀錄 #QuerySet
<10> count(): 返回資料庫中匹配查詢(QuerySet)的物件數量。 # int
<11> first(): 返回第一條記錄 # model物件
<12> last(): 返回最後一條記錄 # model物件
<13> exists(): 如果QuerySet包含資料,就返回True,否則返回False
querySet支援鏈式操作:
models.Article.objects.all().filter().values().distinct().count()
QuerySet資料型別:
1、可切片,可迭代 [obj,....]
2、惰性查詢:
articles_list=models.Article.objects.all()
使用articles_list,比如if articles_list,這時轉換sql語句
3、快取機制
articles_list=models.Article.objects.all()
for i in articles_list:
print(i.title) # hit the database
for i in articles_list:
print(i.title) # not hit the database
==============================================
for i in models.Article.objects.all():
print(i.title) # hit the database
for i in models.Article.objects.all():
print(i.title) # hit the database
4、最佳化查詢
articles_list=models.Article.objects.all().iterator()
for i in articles_list:
print(i.title) # hit the database
for i in articles_list:
print(i.title) # 無結果
連表操作:
表關係:
class UserInfo(AbstractUser): # settings: AUTH_USER_MODEL = "blog.UserInfo"
"""
使用者資訊
"""
nid = models.BigAutoField(primary_key=True)
nickname = models.CharField(verbose_name='暱稱', max_length=32,null=True)
telephone = models.CharField(max_length=11, blank=True, null=True, unique=True, verbose_name='手機號碼')
avatar = models.FileField(verbose_name='頭像', upload_to='avatar', default="avatar/default.png")
create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True)
class Blog(models.Model):
"""
站點資訊
"""
nid = models.BigAutoField(primary_key=True)
title = models.CharField(verbose_name='個人部落格標題', max_length=64)
site = models.CharField(verbose_name='個人部落格字尾', max_length=32, unique=True)
theme = models.CharField(verbose_name='部落格主題', max_length=32)
user = models.OneToOneField(to='UserInfo', to_field='nid')
class Category(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(verbose_name='分類標題', max_length=32)
blog = models.ForeignKey(verbose_name='所屬部落格', to='Blog', to_field='nid')
class Article(models.Model):
nid = models.BigAutoField(primary_key=True)
title = models.CharField(max_length=50, verbose_name='文章標題')
desc = models.CharField(max_length=255, verbose_name='文章描述')
# category欄位: 與Article物件關聯的category物件
category = models.ForeignKey(verbose_name='文章型別', to='Category', to_field='nid', null=True)
# user欄位:與Article物件關聯的user欄位
user = models.ForeignKey(verbose_name='所屬使用者', to='UserInfo', to_field='nid')
tags = models.ManyToManyField(
to="Tag",
through='Article2Tag',
through_fields=('article', 'tag'),
)
class ArticleDetail(models.Model):
nid = models.AutoField(primary_key=True)
content = models.TextField(verbose_name='文章內容', )
article = models.OneToOneField(verbose_name='所屬文章', to='Article', to_field='nid')
class Article2Tag(models.Model):
nid = models.AutoField(primary_key=True)
article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field='nid')
class Tag(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(verbose_name='標籤名稱', max_length=32)
blog = models.ForeignKey(verbose_name='所屬部落格', to='Blog', to_field='nid'
關聯表的新增記錄操作:
1、建立一篇文章物件:
user_obj=models.UserInfo.objects.get(nid=1)
category_obj=models.Category.objects.get(nid=2)
#################一對多關係繫結#########################
# 方式1:
article_obj=models.Article.objects.create(nid=5,title="朝花夕拾"....,user=user_obj,category=category_obj)
# 方式2:
article_obj=models.Article.objects.create(nid=5,title="朝花夕拾"....,user_id=1,category_id=2)
'''
Article:
nid title user_id category_id
5 朝花夕拾 1 2
'''
############################多對多關係繫結#########################
if 沒有中介模型:
tags = models.ManyToManyField("Tag")
'''
ORM建立的第三張表:
Article2tags:
nid article_id tag_id
1 5 1
2 5 2
'''
例項:給article_obj繫結kw1,kw2的標籤
tag1=Tag.objects.filter(title=kw1).first()
tag2=Tag.objects.filter(title=kw2).first()
article_obj.tags.add(tag1,tag2) #
article_obj.tags.add(*[tag1,tag2])
article_obj.tags.add(1,2)
article_obj.tags.add(*[1,2])
解除關係:
article_obj.tags.remove(tag1,tag2)
article_obj.tags.clear()
重置關係:
article_obj.tags.clear()
article_obj.tags.add(tag1,tag2)
=====
article_obj.tags.set(tag1,tag2)
if 有中介模型:
tags = models.ManyToManyField(
to="Tag",
through='Article2Tag',
through_fields=('article', 'tag'),
)
class Article2Tag(models.Model): # 中介模型
nid = models.AutoField(primary_key=True)
article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid')
tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field='nid')
繫結多對多的關係,有中介模型,不能再使用article_obj.tags.add(),remove()等方法;
只能用Article2Tag表進行例項物件。
例項:給article_obj繫結kw1,kw2的標籤:
models.Article2Tag.objects.create(tag_id=1,article_id=5)
models.Article2Tag.objects.create(tag_id=2,article_id=5)
複製程式碼
連表操作(基於物件查詢):
複製程式碼
一對多的查詢:
例項1:查詢主鍵為4的文章的分類名稱(正向查詢,按欄位)
article_obj=models.Article.objects.get(nid=4)
print(article_obj.category.title)
SELECT * FROM "blog_article" WHERE "blog_article"."nid" = 4; // category_id=2
SELECT * FROM "blog_category" WHERE "blog_category"."nid" = 2;
例項2:查詢使用者yuan發表過的所有的文章(反向查詢,表名_set)
yuan=models.UserInfo.objects.get(username="yuan")
book_list=yuan.article_set.all() # QuerySet
多對多的查詢:
例項3:查詢主鍵為4的文章的標籤名稱(正向查詢,按欄位)
article_obj=models.Article.objects.get(nid=4)
tag_list=article_obj.tags.all() # 是透過Article2Tag找到tag表中關聯的tag記錄
for i in tag_list:
print(i.title)
例項4:查詢web開發的這個標籤對應的所有的文章(反向查詢,按表名_set)
tag_obj=models.Tag.objects.get(title="web開發")
article_list=tag_obj.article_set.all()
for i in article_list:
print(i.title)
例項5:查詢web開發的這個標籤對應的所有的文章對應的作者名字
tag_obj=models.Tag.objects.get(title="web開發")
article_list=tag_obj.article_set.all()
for article in article_list:
print(article.user.username)
基於QuerySet跨表查詢 ( 正向查詢,按欄位 ;反向查詢,按表名)
一對多的查詢:
例項1:查詢主鍵為4的文章的分類名稱
models.Article.objects.filter(nid=4).values("category__title")
models.Category.objects.filter(article__nid=4).values("title")
例項2:查詢使用者yuan發表過的所有的文章
models.UserInfo.objects.filter(username="yuan").values(article__title)
models.Article.objects.filter(user__username="yuan").values("title")
多對多的查詢:
例項3:查詢主鍵為4的文章的標籤名稱(正向查詢,按欄位)
models.Article.objects.filter(nid=4).values("tags__title")
models.Tag.objects.filter(article__nid=4).values("title")
例項4:查詢web開發的這個標籤對應的所有的文章(反向查詢,按表名_set)
models.Article.objects.filter(tags__title="web開發").values("title")
models.Tag.objects.filter(title="web開發").values("article__title")
例項5:查詢web開發的這個標籤對應的所有的文章對應的作者名字
models.Tag.objects.filter(title="web開發").values("article__user__username")
models.UserInfo.objects.filter(article__tags__title="web開發").values("username")
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31543790/viewspace-2565024/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 知識點總結
- Java 知識點總結Java
- iOS 知識點總結iOS
- MongoDB知識點總結MongoDB
- HDFS知識點總結
- HBase知識點總結
- jQuery 知識點總結jQuery
- Kafka知識點總結Kafka
- Tomcat 知識點總結Tomcat
- MySQL知識點總結MySql
- 前端知識點總結——Vue前端Vue
- 知識點漏缺總結
- 事務知識點總結
- HBase知識點集中總結
- 前端知識點總結——HTML前端HTML
- 前端知識點總結——DOM前端
- docker常用知識點總結Docker
- mysql 常用知識點總結MySql
- (5)FIFO知識點總結
- HTML-知識點總結HTML
- RabbitMQ 常用知識點總結MQ
- MySQL 索引知識點總結MySql索引
- 由django請求生命週期延伸出的知識點大總結Django
- 跨域知識點部分總結跨域
- Java基礎知識點總結Java
- java面試知識點總結Java面試
- 總結的小知識點(一)
- 筆試題知識點總結筆試
- 瀏覽器知識點總結瀏覽器
- HTTP協議知識點總結HTTP協議
- Vue學習知識點總結Vue
- 總結的Java知識點集合Java
- HTML5知識點總結HTML
- CSS知識點面試總結CSS面試
- 總結 MySQL 相關知識點MySql
- Java 面試知識點總結Java面試
- 散知識點總結(持更)
- Core Java 的知識點總結Java