一 在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'))