django知識點總結

ii_chengzi發表於2019-01-28
一、檢視函式:
 
請求物件-----------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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章