一、視圖函數: 請求對象 request: 1、HttpRequest.body: 請求原數據 2、HttpRequest.path: 一個字元串,表示請求的路徑組件(不含功能變數名稱) 3、HttpRequest.method 4、HttpRequest.GET 5、HttpRequest.POST 6、 ...
一、視圖函數:
請求對象-----------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
'''