1. 程式人生 > >django-5-使用資料庫

django-5-使用資料庫

修改預設資料庫

  django預設資料庫為 SQLite3,若需要修改,比如改成mysql,則需要修改與settings.py檔案同路徑的__init__.py檔案,新增如下內容:

  

import pymysql
pymysql.install_as_MySQLdb()

  

ORM

 

  1、單表增刪改查

    在models.py檔案中建立資料庫物件,然後同步資料庫。

      

from django.db import models
 
 
class Person(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()

    在views.py中匯入models.py(from app.models import *),然後可以在函式或者方法中使用如下內容來呼叫資料庫。

    增:

 1 增加資料有兩種方式
 2 
 3 方式1
 4 
 5 b = Person(name=”姓名“,age=年齡)
 6 b.save()
 7 
 8 
 9 方式二
10 
11 Person.objects.create(name=”姓名“,age=年齡)

 

    改:

方式1
Person.objects.filter(name="姓名").update(age=新的年齡)  

方式2

p
= Person.objects.get(name="姓名") p.age = 新的年齡 p.save() 請注意get只能取出一條,多了會報錯。

 

  

   刪:

Person.objects.filter(name="姓名").delete()

   查詢:

    都是通過objects來呼叫查詢方法:如Person.objects.all()

    

 1 # 查詢相關API:
 2 
 3 #  <1>filter(**kwargs):      它包含了與所給篩選條件相匹配的物件
 4 
 5 #  <2>all():                 查詢所有結果
6 7 # <3>get(**kwargs): 返回與所給篩選條件相匹配的物件,返回結果有且只有一個,如果符合篩選條件的物件超過一個或者沒有都會丟擲錯誤。 8 9 #-----------下面的方法都是對查詢的結果再進行處理:比如 objects.filter.values()-------- 10 11 # <4>values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,執行後得到的並不是一系列 model的例項化物件,而是一個可迭代的字典序列 12 13 # <5>exclude(**kwargs): 它包含了與所給篩選條件不匹配的物件 14 15 # <6>order_by(*field): 對查詢結果排序 16 17 # <7>reverse(): 對查詢結果反向排序 18 19 # <8>distinct(): 從返回結果中剔除重複紀錄 20 21 # <9>values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列 22 23 # <10>count(): 返回資料庫中匹配查詢(QuerySet)的物件數量。 24 25 # <11>first(): 返回第一條記錄 26 27 # <12>last(): 返回最後一條記錄 28 29 # <13>exists(): 如果QuerySet包含資料,就返回True,否則返回False。

 

  2、一對多

      建立資料庫:

      

 1 from django.db import models
 2 class Publisher(models.Model):
 3     name = models.CharField(max_length=30, verbose_name="名稱")
 4     address = models.CharField("地址", max_length=50)
 5     city = models.CharField('城市',max_length=60)
 6     state_province = models.CharField(max_length=30)
 7     country = models.CharField(max_length=50)
 8     website = models.URLField()
 9  
10  
11     def __str__(self):
12         return self.name
13 
14  
15 class Book(models.Model):
16     title = models.CharField(max_length=100)
17     publisher = models.ForeignKey("Publisher")
18     publication_date = models.DateField()
19     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
20 
21     def __str__(self):
22         return self.title

 

  publisher = models.ForeignKey("Publisher")就是建立外來鍵關聯。

    增:

 1 #一對多(ForeignKey):
 2 
 3     #方式一: 由於繫結一對多的欄位,比如publish,存到資料庫中的欄位名叫publish_id,所以我們可以直接給這個
 4     #       欄位設定對應值:
 5            Book.objects.create(title='php',
 6                                publisher_id=2,   #這裡的2是指為該book物件綁定了Publisher表中id=2的行物件
 7                                publication_date='2017-7-7',
 8                                price=99)
 9 
10 
11     #方式二:
12     #       <1> 先獲取要繫結的Publisher物件:
13         pub_obj=Publisher(name='河大出版社',address='保定',city='保定',
14                 state_province='河北',country='China',website='http://www.hbu.com')
15     OR  pub_obj=Publisher.objects.get(id=1)
16 
17 Book.objects.create(title='php',
18                                 publisher=pub_obj,   #將 publisher_id=2 改為  publisher=pub_obj
19                                publication_date='2017-7-7',
20                                price=99)

 

    

  3、多對多  

      

 1 from django.db import models<br>
 2 class Publisher(models.Model):
 3     name = models.CharField(max_length=30, verbose_name="名稱")
 4     address = models.CharField("地址", max_length=50)
 5     city = models.CharField('城市',max_length=60)
 6     state_province = models.CharField(max_length=30)
 7     country = models.CharField(max_length=50)
 8     website = models.URLField()
 9  
10     class Meta:
11         verbose_name = '出版商'
12         verbose_name_plural = verbose_name
13  
14     def __str__(self):
15         return self.name
16  
17 class Author(models.Model):
18     name = models.CharField(max_length=30)
19     def __str__(self):
20         return self.name
21  
22 class AuthorDetail(models.Model):
23     sex = models.BooleanField(max_length=1, choices=((0, ''),(1, ''),))
24     email = models.EmailField()
25     address = models.CharField(max_length=50)
26     birthday = models.DateField()
27     author = models.OneToOneField(Author)
28  
29 class Book(models.Model):
30     title = models.CharField(max_length=100)
31     authors = models.ManyToManyField(Author)
32     publisher = models.ForeignKey(Publisher)
33     publication_date = models.DateField()
34     price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
35     def __str__(self):
36         return self.title

    增:

    

#多對多(ManyToManyField()):

    author1=Author.objects.get(id=1)
    author2=Author.objects.filter(name='alvin')[0]
    book=Book.objects.get(id=1)
    book.authors.add(author1,author2)
    #等同於:
    book.authors.add(*[author1,author2])
    book.authors.remove(*[author1,author2])
    #-------------------
    book=models.Book.objects.filter(id__gt=1)
    authors=models.Author.objects.filter(id=1)[0]
    authors.book_set.add(*book)
    authors.book_set.remove(*book)
    #-------------------
    book.authors.add(1)
    book.authors.remove(1)
    authors.book_set.add(1)
    authors.book_set.remove(1)

#注意: 如果第三張表是通過models.ManyToManyField()自動建立的,那麼繫結關係只有上面一種方式
#     如果第三張表是自己建立的:
     class Book2Author(models.Model):
            author=models.ForeignKey("Author")
            Book=  models.ForeignKey("Book")
#     那麼就還有一種方式:
            author_obj=models.Author.objects.filter(id=2)[0]
            book_obj  =models.Book.objects.filter(id=3)[0]

            s=models.Book2Author.objects.create(author_id=1,Book_id=2)
            s.save()
            s=models.Book2Author(author=author_obj,Book_id=1)
            s.save()

     刪:

1 Book.objects.filter(id=1).delete()
2 #我們表面上刪除了一條資訊,實際卻刪除了三條,因為我們刪除的這本書在Book_authors表中有兩條相關資訊,這種刪除方式就是django預設的級聯刪除。

 

        

 

 

 

同步資料庫 (將寫好的資料表寫入資料庫)

  # Django 1.6.x 及以下

  python manage.py syncdb     # Django 1.7 及以上的版本需要用以下命令   python manage.py makemigrations   python manage.py migrate             參考:https://www.cnblogs.com/yuanchenqi/articles/6083427.htm