09 Django 模型(數據庫)

Django 模型是與數據庫相關的,與數據庫相關的代碼通常寫在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等數據庫,只須要在settings.py中配置便可,不用更改models.py中的代碼,豐富的API極大的方便了使用。python

 

1、打開model文件,修改其中代碼正則表達式

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

咱們新建了一個Person類,繼承自models.Model, 一我的有姓名和年齡。這裏用到了兩種Field,更多Field類型能夠參考教程最後的連接。sql

說明:這部分的做用在於建立咱們業務須要的數據表及其結構,當咱們在這以後執行同步數據庫的時候會建立這些表,若是已經建立則忽略,若是有修改也會進行更新操做。shell

 

2、同步數據庫數據庫

在同步數據庫以前,咱們須要設置數據庫,若是你用的是SQLite3,則無需配置,若是你使用的是其餘Django內置的數據庫,參考Django的教程也能很快進行配置,我用的數據庫是SQL Server,由於它不是Django自身支持的數據之一,因此配置這個數據庫須要用到第三方模塊。中間遇到很多坑,最終配置成功,現將主要步驟介紹一下:django

一、第三方庫django-pyodbc-azure,使用這個庫的基礎是Django 1.10.4 和pyodbc 3.0 or newerthis

  1. Install pyodbc and Django
  2. Install django-pyodbc-azure
pip install django-pyodbc-azure

Here is an example of the database settings:spa

DATABASES = {
    'default': {
         'ENGINE': 'sql_server.pyodbc',
         'NAME': 'Django_test',
         'USER': 'sa',
         'PASSWORD': '*****',
         'HOST': '127.0.0.1',
         'PORT': '',
          'OPTIONS': {
              'driver':'SQL Server Native Client 11.0',
              'MARS_Connection': True,

         },
     },
}

# set this to False if you want to turn off pyodbc's connection pooling
DATABASE_CONNECTION_POOLING = False

設置完成以後,就能夠對數據進行同步了,執行以下兩條代碼便可:code

python manage.py makemigrations
python manage.py migrate

咱們會看到,Django生成了一系列的表.server

Django提供了豐富的API, 下面演示如何使用它。

$ python manage.py shell
 
>>> from people.models import Person
>>> Person.objects.create(name="Jason", age=28)
<Person: Person object>

如何從數據庫是查詢數據

>>> Person.objects.get(name="Jason")
<Person: Person object>

咱們用了一個 .objects.get() 方法查詢出來符合條件的對象,可是你們注意到了沒有,查詢結果中顯示<Person: Person object>,這裏並無顯示出與WeizhongTu的相關信息,若是用戶多了就沒法知道查詢出來的究竟是誰,查詢結果是否正確,咱們從新修改一下 people/models.py

name 和 age 等字段中不能有 __(雙下劃線,由於在Django QuerySet API中有特殊含義(用於關係,包含,不區分大小寫,以什麼開頭或結尾,日期的大於小於,正則等)

也不能有Python中的關鍵字,name 是合法的,student_name 也合法,可是student__name不合法,try, class, continue 也不合法,由於它是Python的關鍵字( import keyword; print(keyword.kwlist) 能夠打出全部的關鍵字)

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

     def __str__(self):
            return self.name

 

知識補充:

新建一個對象的方法有如下幾種:

  1. Person.objects.create(name=name,age=age)
  2. p = Person(name="WZ", age=23)

     p.save()

  1. p = Person(name="TWZ")

          p.age = 23

          p.save()

  1. Person.objects.get_or_create(name="WZT", age=23)

這種方法是防止重複很好的方法,可是速度要相對慢些,返回一個元組,第一個爲Person對象,第二個爲True或False, 新建時返回的是True, 已經存在時返回False.

獲取對象有如下方法:

  1. Person.objects.all()
  2. Person.objects.all()[:10] 切片操做,獲取10我的,不支持負索引,切片能夠節約內存
  3. Person.objects.get(name=name) #get是用來獲取一個對象的,若是須要獲取知足條件的一些人,就要用到filter
  4. Person.objects.filter(name="abc") # 等於Person.objects.filter(name__exact="abc") 名稱嚴格等於 "abc" 的人
  5. Person.objects.filter(name__iexact="abc") # 名稱爲 abc 可是不區分大小寫,能夠找到 ABC, Abc, aBC,這些都符合條件
  6. Person.objects.filter(name__contains="abc") # 名稱中包含 "abc"的人
  7. Person.objects.filter(name__icontains="abc") #名稱中包含 "abc",且abc不區分大小寫
  8. Person.objects.filter(name__regex="^abc") # 正則表達式查詢
  9. Person.objects.filter(name__iregex="^abc")# 正則表達式不區分大小寫,filter是找出知足條件的,固然也有排除符合某條件的
  10. Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person對象
  11. Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名稱含有abc, 可是排除年齡是23歲的

 

參考文檔:

Django models 官方教程: https://docs.djangoproject.com/en/dev/topics/db/models/

Fields相關官方文檔:https://docs.djangoproject.com/en/dev/ref/models/fields/

相關文章
相關標籤/搜索