Python_mysql增刪改查

Django ORM操作數據庫常用API
官方文檔
https://docs.djangoproject.com/en/1.11/topics/db/queries/
在這裏插入圖片描述
1.models中構造數據表
在這裏插入圖片描述每個字段定義時,都會有自己的一些特殊的選項指定
在這裏插入圖片描述在大部分項目中,還會涉及到多表關聯操作
在這裏插入圖片描述
class Play(models.Model):
date = models.CharField(max_length=255)
ischeck = models.TextField()
content = models.TextField()
userno = models.TextField()

    def __str__(self):              # __unicode__ on Python 2
        return self.name
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

2.執行命令就可生成數據庫表

 python manage.py makemigrations
 python manage.py migrate

3.view中調用

def testModel(request):
     b = Blog(name='Beatles Blog',tagline='All the lastest Beatles news')
     b.save()
     return HttpResponse("hello world")

4.改變對象的值

 b5.name = 'New name'
 b5.save()

5.保存 ForeignKey 和 ManyToManyField 字段
現在,我們數據已經保存了,並已經建立了關聯
在model中,Entry關聯了外鍵Blog(ForeignKey )
所以在創建Entry的時候,要先獲取一個Blog對象,給Entry賦值之後,才執行保存數據庫的操作

from blog.models import Blog, Entry
 entry = Entry.objects.get(pk=1)
 cheese_blog = Blog.objects.get(name="Cheddar Talk")
 entry.blog = cheese_blog
 entry.save()

6.更新ManyToManyField的工作方式略有不同,在字段上使用add()方法將記錄添加到關係中。這個示例將Author實例joe添加到條目對象

from blog.models import Author
 joe = Author.objects.create(name="Joe")
 entry.authors.add(joe)

7.要一次性向ManyToManyField添加多條記錄,請在add()調用中包含多個參數,如下所示

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

8.取回數據
要從數據庫檢索對象,請通過模型類上的管理器構造一個QuerySet。QuerySet表示數據庫中的對象集合。它可以有0個,1個或多個過濾器。過濾器根據給定的參數縮小查詢結果。在SQL術語中,QuerySet等同於SELECT語句,過濾器是一個限制子句,例如WHERE或LIMIT。通過使用model s管理器可以獲得一個查詢集。每個模型至少有一個管理器,在默認情況下稱爲對象。直接通過model類訪問它,如下所示

     Blog.objects
    <django.db.models.manager.Manager object at ...>
     b = Blog(name='Foo', tagline='Bar')
     b.objects
    Traceback:
        ...
    AttributeError: "Manager isn't accessible via Blog instances."
   # data = entry.authors.iterator()

注意:只有通過模型類才能訪問管理器,而不是從模型實例訪問管理器,以強制表級操作和記錄級操作之間的分離。
9.查詢所有數據

all_entries = Entry.objects.all()

10.按條件查詢

filter(**kwargs) 返回一個新的匹配查詢參數後的QuerySet

exclude(**kwargs) 返回一個新的不匹配查詢參數後的QuerySet

Entry.objects.filter(pub_date__year=2006)

q2 = q1.exclude(pub_date__gte=datetime.date.today())

11.鏈接查詢

Entry.objects.filter(headline__startswith='What')
.exclude(pub_date__gte=datetime.now())
.filter(pub_date__gte=datetime(2005, 1, 1))

12.延遲查詢

創建QuerySets不會觸及到數據庫操作,你可以多個過濾合併到一起,直到求值的時候django纔會開始查詢

q = Entry.objects.filter(headline__startswith="What")
q = q.filter(pub_date__lte=datetime.now())
q = q.exclude(body_text__icontains="food")

13.檢索單個對象

one_entry = Entry.objects.get(pk=1)

14.限制查詢:分頁/排序查詢

Entry.objects.all()[:5]

Entry.objects.order_by('headline')[0:1].get()

15.字段查詢

Entry.objects.filter(pub_date__lte='2006-01-01')

轉換成SQL:

SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';

16.exact

Entry.objects.get(headline__exact="Man bites dog")

轉換成SQL:

SELECT ... WHERE headline = 'Man bites dog';

17.iexact——忽略大小寫

Blog.objects.get(name__iexact="beatles blog")

18.contains——包含查詢,區分大小寫

Entry.objects.get(headline__contains='Lennon')

轉換成SQL:

SELECT ... WHERE headline LIKE '%Lennon%';

icontains 不區分大小寫

startswith,endswith,istartswith,iendswith

19.連接查詢

查詢blog__name匹配的,返回Entry

Entry.objects.filter(blog__name__exact='Beatles Blog')

查詢entry__headline匹配的,返回Blog

Blog.objects.filter(entry__headline__contains='Lennon')

如果跨越多層關係查詢,中間模型沒有值,django會作爲空對待不會發生異常

Blog.objects.filter(entry__author__name='Lennon');
Blog.objects.filter(entry__author__name__isnull=True);
Blog.objects.filter(
entry__author__isnull=False,
entry__author__name__isnull=True);

20.F對象,對字段進行操作。就像SQL中,A列+B列。F對象很少用

from django.db.models import F
Entry.objects.filter(n_pingbacks__lt=F('n_comments'))

列加減乘除都可以

Entry.objects.filter(n_pingbacks__lt=F('n_comments') * 2) 
Entry.objects.filter(rating__lt=F('n_comments') + F('n_pingbacks')) 
Entry.objects.filter(author__name=F('blog__name'))
16.like語句轉義百分號

Entry.objects.filter(headline__contains='%')

轉義爲:

SELECT ... WHERE headline LIKE '%\%%';

21.刪除

q = Entry.objects.filter(headline__startswith="What")

q.delete()

22.批量修改

Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')

一次性修改所有的Entry的blog屬性指向

b = Blog.objects.get(pk=1)

Entry.objects.all().update(blog=b)

update也可以使用F()

Entry.objects.update(headline=F('blog__name'))

23.One-to-many關係

    e = Entry.objects.get(id=2)
    print e.blog # Hits the database to retrieve the associated Blog
    
    e = Entry.objects.select_related().get(id=2)
    print e.blog # 不會在向數據庫取; 使用緩存中的值.
    
    b = Blog.objects.get(id=1)
    b.entry_set.all() # 返回所有blog的關聯對象.
 b.entry_set is a Manager that returns QuerySets.
b.entry_set.filter(headline__contains='Lennon')
b.entry_set.count()

b = Blog.objects.get(id=1)
b.entries.all() # 返回所有blog的關聯對象
 b.entries is a Manager that returns QuerySets.
b.entries.filter(headline__contains='Lennon')
b.entries.count()

 
add(obj1, obj2, ...) 把多個對象建立連接

create(**kwargs) 建立新對象

remove(obj1, obj2, ...) 移除多個關係對象

clear() 清理所有關係對象

24.Many-to-many關係

e = Entry.objects.get(id=3)
e.authors.all() # 返回Entry所有authors 
e.authors.count()
e.authors.filter(name__contains='John')

a = Author.objects.get(id=5)
a.entry_set.all() # 返回Author所有entry

25.One-to-one關係

要在定義模型的時候設置

class EntryDetail(models.Model):
entry = models.OneToOneField(Entry)
details = models.TextField()

ed = EntryDetail.objects.get(id=2)
ed.entry # 返回 Entry 對象.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章