1. 程式人生 > >django-5-使用數據庫

django-5-使用數據庫

條件 關系 pub 綁定 div filter url choice key

修改默認數據庫

  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

django-5-使用數據庫