django orm 數據查詢詳解


 

一 在django里面創建模型

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Author(models.Model):
    name = models.CharField(max_length=200)
    email = models.EmailField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Entry(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
    headline = models.CharField(max_length=255)
    body_text = models.TextField()
    pub_date = models.DateField()
    mod_date = models.DateField()
    authors = models.ManyToManyField(Author)
    n_comments = models.IntegerField()
    n_pingbacks = models.IntegerField()
    rating = models.IntegerField()

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

 1.2 數據庫里面的結構

  需要注意多對多的中間表

1.3 創建對象

from blog.models import Blog

這里需要注意 一定要對屬性的名字寫上 另外save方法有括號

 

 1.3 創建外鍵對象並保存

這里需要注意 blog是外鍵  這里只能賦值給一個外鍵的對象 或者數字1 2 3 4(代表外鍵的  對方的ID)

e.headline="my2 bolg"
e.body_text="test"
e.pub_date=datetime.date.today()
emod_date=datetime.date.today()
e.n_comments=12
e.pingbacks=20
e.eating=10
e.blog=b   ##這里需要特別注意
e.save()

 e.blog=1 這種寫法存疑

1.4 多對多

john = Author.objects.create(name="John")
paul = Author.objects.create(name="Paul")
george = Author.objects.create(name="George")
ringo = Author.objects.create(name="Ringo")
e.authors.add(john, paul, george, ringo)

注意這里的對應關系存儲在中間表中

 

二 檢索對象

1.2  這里注意必須用類名  不能使用 對象名!!!

2.2 過濾

這里注意 有2個下划線  django的固定語法

>>> Entry.objects.filter(pub_date__year=2019)

<QuerySet [<Entry: my1 bolg>, <Entry: my2 bolg>]>

 exclude 排除

 

 過濾的結果都是列表 可以繼續鏈式過濾

1.3  上面返回的都是列表 可以用get方法返回單一的值

這里需要注意 如果查詢不到會拋出異常,多余一個也會拋出異常

 

1.4 外鍵關聯查詢

>>> from blog.models import Blog,Entry,Author
>>>
>>> Entry.objects.filter(blog__name="Beatles Blog1")
<QuerySet [<Entry: my1 bolg>]>

這里需要注意 可以通過blog(外鍵)找到對應的類 然后過濾屬性 name="XXX"

 

 反向關聯

>>> Blog.objects.filter(entry__headline="my1 bolg")
<QuerySet [<Blog: Beatles Blog1>]>

 這里一定要注意 filter后面的  是  關聯的 類 的小寫 名稱entry!!!!!!!!

多條件同時反向查詢!! 這里一定要注意 返回值是Blog對象  entry只是作為查詢的邦族條件

 

 

 3 F表達式

 

例如,為了查找comments數目多於pingbacks數目的Entry,可以構造一個F()對象來引用pingback數目,並在查詢中使用該F()對象:

>>> from django.db.models import F
>>> Entry.objects.filter(n_comments__gt=F('n_pingbacks'))

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM