国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Djangoqueryset

2019-11-14 17:35:15
字體:
來源:轉載
供稿:網友
  1. model對應數據庫表,model的實例則對應表中的一條記錄.
    from blog.models import Blogb = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')#調用save后才會在表中生成記錄,b.id才會有值,因為id是數據庫生成的#此處save相當于調用了insert語句b.save()b.name="Tom"#此處save相當于調用update語句b.save()

    #create方法包含創建對象并save到數據庫
    Blog.objects.create(name='news Blog', tagline='All news.')
    添加ForeignKey和ManyToManyField的field值
    from blog.models import Entryentry = Entry.objects.get(pk=1)cheese_blog = Blog.objects.get(name="Cheddar Talk")#ForeighnKey成員,直接賦值entry.blog = cheese_blogentry.save()#ManyToManyField成員需要調用add方法joe = Author.objects.create(name="Joe")entry.authors.add(joe)#添加多個成員時paul = Author.objects.create(name="Paul")george = Author.objects.create(name="George")ringo = Author.objects.create(name="Ringo")entry.authors.add(paul,george,ringo)
  2. 每個model class都有一個Manager成員,默認名字為objects,注意是model class而不是model instance,Model.objects.all()返回所有QuerySet包含所有表中的對象.注意QuerySet是lazy的,創建時候并不會執行實際操作,只有evaluated時才真正執行操作。可以通過下面兩個函數返回滿足一定條件的QuerySet:
    • filter(**kwargs):滿足指定查詢條件的QuerySet
    • exclude(**kwargs):不滿足查詢條件的QuerySet
  3. 每個QuerySet都包含一個cache,以減少對數據庫的訪問,剛定義queryset時cache為空,evluated后cache就有值了,之后訪問queryset都是訪問cache中的值
    #執行兩次數據庫查詢PRint([e.headline for e in Entry.objects.all()])print([e.pub_date for e in Entry.objects.all()])queryset = Entry.objects.all()print([p.headline for p in queryset]) # Evaluate the query set.print([p.pub_date for p in queryset]) # Re-use the cache from the evaluation.queryset = Entry.objects.all()#只返回queryset中的一部分print queryset[5] # Queries the databaseprint queryset[5] # Queries the database againqueryset = Entry.objects.all()[entry for entry in queryset] # Queries the databaseprint queryset[5] # Uses cacheprint queryset[5] # Uses cache#如下操作都會導致queryset evaluated,填充cache[entry for entry in queryset]bool(queryset)entry in querysetlist(queryset)
  4. 可以返回QuerySet中的子集,相當于sql語句中的limit和offset
    Entry.objects.all()[:5]Entry.objects.all()[5:10]Entry.objects.order_by('headline')[0]
  5. 返回單個對象使用get方法,如果對象不存在會拋出Model.DoesNotExist異常,如果有多個滿足條件的對象則拋出Model.MultipleObjectsReturned異常。注意此處與QuerySet object[0]的區別,如果沒有獲取滿足條件的QuerySet,用下標取對象會拋出IndexError的異常
  6. field查詢:filter,get等函數都使用field進行查詢,如果field不存在則會拋TypeError異常。例外的是以ForeignKey類型的field作查詢參數時,可以在該field后面加”_id”,
    #查找外鍵blog id=4的所有EntryEntry.objects.filter(blog_id=4)
    一些比較常用的查詢關鍵字:
    • exact:精確匹配,默認使用
      #效果相同Blog.objects.get(id__exact=14) Blog.objects.get(id=14)
    • iexact:匹配時忽略大小寫
    • contains:包含查詢,大小寫敏感
      #相當于SELECT ... WHERE headline LIKE '%Lennon%';Entry.objects.get(headline__contains='Lennon')
    • icontains:包含查詢,大小寫不敏感
    • startswith,endswith:匹配開頭或結尾,大小寫敏感
    • istartswith,iendswith:匹配開頭或結尾,大小寫不敏感
    • in:是否在某個list中
    • gt,lt,gte,lte等比較操作
    • year,month,day,week_day,hour,minute,seconde等時間操作
    • isnull:是否為空
  7. 跨relationship的field查詢,
    #entry與blog是多對一的關系Entry.objects.filter(blog__name='Beatles Blog')Blog.objects.filter(entry__headline__contains='Lennon')#entry與authors是多對多關系Blog.objects.filter(entry__authors__name='Lennon')Blog.objects.filter(entry__authors__name__isnull=True)Blog.objects.filter(entry__authors__isnull=False,   entry__authors__name__isnull=True)
    注意下面代碼的區別
    #返回的blog 同時滿足參數中的兩個條件Blog.objects.filter(entry__headline__contains='Lennon',        entry__pub_date__year=2008)#blog包含多個entry,只要其中有兩個分別滿足下面兩個條件,就返回blogBlog.objects.filter(entry__headline__contains='Lennon').filter(        entry__pub_date__year=2008)
  8. F class:用于獲取model field的值
    Q class:用于定義重用查詢條件,Q objects可以使用&和|進行組合,這樣會生成新的Q object,field的查詢關鍵字都可以在Q object的參數中使用
    Q(question__startswith='Who') | ~Q(pub_date__year=2005)Poll.objects.get(    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),    question__startswith='Who')

    reporter = Reporters.objects.get(name='Tintin')reporter.stories_filed += 1reporter.save()#與上面代碼效果相同reporter = Reporters.objects.filter(name='Tintin')reporter.update(stories_filed=F('stories_filed') + 1)#更新所有stories_fieldReporter.objects.all().update(stories_filed=F('stories_filed') + 1)

    Entry.objects.filter(authors__name=F('blog__name'))
  9. 刪除對象使用delete()方法,model和queryset都包含此方法用于刪除單個或者多個對象。對于外鍵對象,如果定義時設置了on_delete參數為true,那么刪除外鍵對象時會把指向該外鍵對象的對象也刪除
    e.delete()Entry.objects.filter(pub_date__year=2005).delete()Entry.objects.all().delete()b = Blog.objects.get(pk=1)# This will delete the Blog and all of its Entry objects.b.delete()
  10. 復制對象:
    • 簡單情況
      blog = Blog(name='My blog', tagline='Blogging is easy')blog.save() # blog.pk == 1# 設置pk為Noneblog.pk = Noneblog.save() # blog.pk == 2
    • 繼承類
      class ThemeBlog(Blog):    theme = models.CharField(max_length=200)django_blog = ThemeBlog(name='Django', tagline='Django is easy', theme='python')django_blog.save() # django_blog.pk == 3#需要設置id和pk為Nonedjango_blog.pk = Nonedjango_blog.id = Nonedjango_blog.save() # django_blog.pk == 4
    • 上面兩種方式都不給related object賦值,賦值related object的代碼如下:
      entry = Entry.objects.all()[0] # some previous entryold_authors = entry.authors.all()entry.pk = Noneentry.save()entry.authors = old_authors # saves new many2many relations

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镶黄旗| 财经| 同心县| 南宫市| 乡城县| 额尔古纳市| 文水县| 临邑县| 陕西省| 腾冲县| 南充市| 绥滨县| 剑河县| 云和县| 福清市| 衡水市| 昭通市| 泾阳县| 雷山县| 大冶市| 湖北省| 石泉县| 台江县| 盘山县| 黔西| 南涧| 荥经县| 大安市| 长沙县| 揭西县| 乐都县| 古浪县| 墨脱县| 合阳县| 清涧县| 库伦旗| 稻城县| 益阳市| 青铜峡市| 余江县| 横山县|