1. 程式人生 > >Django基礎(ORM)

Django基礎(ORM)

包含 ica install 需要 pro 性別 auth 它的 date

數據庫與ORM

數據庫的配置

1 django默認支持sqlite,mysql, oracle,postgresql數據庫。

<1> sqlite

django默認使用sqlite的數據庫,默認自帶sqlite的數據庫驅動 , 引擎名稱:django.db.backends.sqlite3

<2> mysql

引擎名稱:django.db.backends.mysql

2 mysql驅動程序

  • MySQLdb(mysql python)
  • mysqlclient
  • MySQL
  • PyMySQL(純python的mysql驅動程序)

3 在django的項目中會默認使用sqlite數據庫,在settings裏有如下設置:

技術分享圖片

如果我們想要更改數據庫,需要修改如下:

技術分享圖片

技術分享圖片 技術分享圖片
DATABASES = {

    default: {

        ENGINE‘: django.db.backends.mysql, 

        NAME‘: books‘,    #你的數據庫名稱

        USER‘: root‘,   #你的數據庫用戶名

        PASSWORD‘: ‘‘, #你的數據庫密碼

        HOST‘: ‘‘, #你的數據庫主機,留空默認為localhost

        PORT‘: 3306‘, #你的數據庫端口

    }

}
技術分享圖片

註意:

技術分享圖片
NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建

USER和PASSWORD分別是數據庫的用戶名和密碼。

設置完後,再啟動我們的Django項目前,我們需要激活我們的mysql。

然後,啟動項目,會報錯:no module named MySQLdb

這是因為django默認你導入的驅動是MySQLdb,可是MySQLdb對於py3有很大問題,所以我們需要的驅動是PyMySQL

所以,我們只需要找到項目名文件下的__init__,在裏面寫入:

import pymysql
pymysql.install_as_MySQLdb()

問題解決!
技術分享圖片

總結詳細步驟:
1. 手動創建數據庫
2. 在app/models.py裏面寫上一個類,必須繼承models.Model這個類 (註意啟動Django項目)
3. 在Django 項目的settings.py 裏面 配置上數據庫的相關信息
4. 在Django項目裏的__init__.py裏面寫上 兩句話 import pymysql pymysql.install_as_MySQLdb()
5. 給Django發布命令
1. python manage.py makemigrations # 相當於去你的models.py 裏面看一下有沒有改動
2. python manage.py migrate # 把改動翻譯成SQL語句,然後去數據庫執行

ORM表模型

表(模型)的創建:

實例:我們來假定下面這些概念,字段和關系

作者模型:一個作者有姓名。

作者詳細模型:把作者的詳情放到詳情表,包含性別,email地址和出生日期,作者詳情模型和作者模型之間是一對一的關系(one-to-one)(類似於每個人和他的身份證之間的關系),在大多數情況下我們沒有必要將他們拆分成兩張表,這裏只是引出一對一的概念。

出版商模型:出版商有名稱,地址,所在城市,省,國家和網站。

書籍模型:書籍有書名和出版日期,一本書可能會有多個作者,一個作者也可以寫多本書,所以作者和書籍的關系就是多對多的關聯關系(many-to-many),一本書只應該由一個出版商出版,所以出版商和書籍是一對多關聯關系(one-to-many),也被稱作外鍵

技術分享圖片 技術分享圖片
from django.db import models<br>
class Publisher(models.Model):
    name = models.CharField(max_length=30, verbose_name="名稱")
    address = models.CharField("地址", max_length=50)
    city = models.CharField(城市‘,max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()
 
    class Meta:
        verbose_name = 出版商
        verbose_name_plural = verbose_name
 
    def __str__(self):
        return self.name
 
class Author(models.Model):
    name = models.CharField(max_length=30)
    def __str__(self):
        return self.name
 
class AuthorDetail(models.Model):
    sex = models.BooleanField(max_length=1, choices=((0, ‘),(1, ),))
    email = models.EmailField()
    address = models.CharField(max_length=50)
    birthday = models.DateField()
    author = models.OneToOneField(Author)
 
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
    def __str__(self):
        return self.title
技術分享圖片

分析代碼:

<1> 每個數據模型都是django.db.models.Model的子類,它的父類Model包含了所有必要的和數據庫交互的方法。並提供了一個簡介漂亮的定義數據庫字段的語法。

<2> 每個模型相當於單個數據庫表(多對多關系例外,會多生成一張關系表),每個屬性也是這個表中的字段。屬性名就是字段名,它的類型(例如CharField)相當於數據庫的字段類型(例如varchar)。大家可以留意下其它的類型都和數據庫裏的什麽字段對應。

<3> 模型之間的三種關系:一對一,一對多,多對多。

一對一:實質就是在主外鍵(author_id就是foreign key)的關系基礎上,給外鍵加了一個UNIQUE=True的屬性;

一對多:就是主外鍵關系;(foreign key)

多對多:(ManyToManyField) 自動創建第三張表(當然我們也可以自己創建第三張表:兩個foreign key)

簡單的增刪改查

查詢數據時需要註意查詢結果為單個對象還是數據對象的列表

技術分享圖片
# 增
models.Tb1.objects.create(c1=‘xx‘, c2=‘oo‘)   # 增加一條數據,可以接受字典類型數據 **kwargs
obj = models.Tb1(c1=‘xx‘, c2=‘oo‘)
obj.save()


# 查
models.Tb1.objects.get(id=123)  # 獲取單條數據,不存在則報錯(不建議)
models.Tb1.objects.all()  # 獲取全部
models.Tb1.objects.filter(name=‘seven‘)  # 獲取指定條件的數據
models.Tb1.objects.exclude(name=‘seven‘)  # 去除指定條件的數據


# 刪
# models.Tb1.objects.filter(name=‘seven‘).delete()  # 刪除指定條件的數據


# 改
models.Tb1.objects.filter(name=‘seven‘).update(gender=‘0‘)   # 將指定條件的數據更新,均支持 **kwargs
obj = models.Tb1.objects.get(id=1)
obj.c1 = ‘111‘
obj.save()   # 修改單條數據

Django基礎(ORM)