django之模型層(model)--建表、查詢、刪除基礎


要說一個項目最重要的部分是什么那鐵定數據了,也就是數據庫,這篇就開始帶大家走進django關於模型層model的使用,model主要就是操縱數據庫不使用sql語句的情況下完成數據庫的增刪改查。本篇僅帶領大家進行簡單的建表、查詢和刪除,因為model的重要性所以后面幾篇都會圍繞ORM慢慢深入。

 

本篇導論:

 

一、ORM

映射關系:

表名 <-------> 類名

字段 <-------> 屬性     

表記錄 <------->類實例對象


 

二、創建表(建立模型)

1、創建表的代碼寫在項目下的models文件中

1)比如我們創建一個圖書表,建立如下:

from django.db import models

# Create your models here.

class Book(models.Model):
    nid = models.AutoField(primary_key=True)    #AutoField有序整形 IntegerField整形
    title = models.CharField(max_length=32)    #CharField字符
    author = models.CharField(max_length=32)
    publishDate = models.DateField()    #DateField日期類型
    price = models.DecimalField(max_digits=5, decimal_places=2)    #DecimalField浮點型也可以用FloatField

類名就是表名,屬性就是字段。繼承django提供給我們的用於做轉換的models.Model才能將我們寫的類轉化為數據庫

定義好模型之后,你需要告訴Django 使用這些模型。你要做的就是修改配置文件。

2)字段常用參數

(1)null

如果為True,Django 將用NULL 來在數據庫中存儲空值。 默認值是 False.

(1)blank

如果為True,該字段允許不填。默認為False。
要注意,這與 null 不同。null純粹是數據庫范疇的,而 blank 是數據驗證范疇的。
如果一個字段的blank=True,表單的驗證將允許該字段是空值。如果字段的blank=False,該字段就是必填的。

(2)default

字段的默認值。可以是一個值或者可調用對象。如果可調用 ,每有新對象被創建它都會被調用。

(3)primary_key

如果為True,那么這個字段就是模型的主鍵。如果你沒有指定任何一個字段的primary_key=True,
Django 就會自動添加一個IntegerField字段做為主鍵,所以除非你想覆蓋默認的主鍵行為,
否則沒必要設置任何一個字段的primary_key=True。

(4)unique

如果該值設置為 True, 這個數據字段的值在整張表中必須是唯一的

(5)choices
由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 如果設置了choices ,默認的表單將是一個選擇框而不是標准的文本框,而且這個選擇框的選項就是choices 中的選項。

這是一個關於 choices 列表的例子:

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)
每個元組中的第一個元素,是存儲在數據庫中的值;第二個元素是在管理界面或 ModelChoiceField 中用作顯示的內容。 在一個給定的 model 類的實例中,想得到某個 choices 字段的顯示值,就調用 get_FOO_display 方法(這里的 FOO 就是 choices 字段的名稱 )。例如:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)


>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
View Code

2、修改配置文件setting

1)django默認使用的是sqlite3數據庫,我們使用的是mysql數據庫所以需要修改配置

原先配置(將這些配置注釋掉)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

重新配置

DATABASES = {

    'default': {
           
        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'blog',    #你的數據庫名稱 數據庫需要自己提前建好

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

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

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

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

    }
}    

3、創建表命令

1)同步更改數據庫表或字段

老版本:
python manage.py syncdb
     
Django 1.7.1 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

2)運行python manage.py makemigrations后我們應用下的migrations文件夾里會自動生成一個文件,是將我們寫的類進一步轉化:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-25 03:30
from __future__ import unicode_literals

from django.db import migrations, models

class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Book',
            fields=[
                ('nid', models.AutoField(primary_key=True, serialize=False)),
                ('title', models.CharField(max_length=32)),
                ('author', models.CharField(max_length=32)),
                ('publishDate', models.DateField()),
                ('price', models.DecimalField(decimal_places=2, max_digits=5)),
            ],
        ),
    ]

3)運行python manage.py migrate后表就插入到我們的數據庫中了

4)注意:

如果我們的python是3.x版本運行上面兩條會報錯

No module named "MySQLdb"

在3.x走數據庫用的是pymysql模塊所以我們需要告訴django用pymysql

在應用下的__init__.py文件里添加代碼

import pymysql

pymysql.install_as_MySQLdb()

運行后在數據庫里查看:

會發現django給我們創建了很多表 我們自己創建的Book表會被自動改名為 應用名_book 這樣避免了我們在不同的應用中有相同的表,其他的表后面用到時會一一介紹。


 

三、查看表

1、先在視圖函數view中將數據取出來

from app01 import models    #app01是應用名

def index(request):
    # 從數據庫取出所有書籍對象
    bookList=models.Book.objects.all()  #    [bookObj1,.....]
    return render(request,"index.html",{"bookList":bookList})

查詢相關

<1> all():    查詢所有結果
<2> filter():    查詢所給篩選條件相匹配的對象

2、在template模版中接收

{% for book_obj in bookList %}
    <tr>
        <td>{{ book_obj.nid }}</td>
        <td>{{ book_obj.title }}</td>
        <td>{{ book_obj.author }}</td>
        <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
        <td>{{ book_obj.price }}</td>
    </tr>
{% endfor %}

 

四、刪除

刪除方法就是 delete()。它運行時立即刪除對象而不返回任何值。

比如我們給表中添加一個刪除按鈕來實現點擊按鈕后數據庫每條記錄的刪除

1、template模版

{% for book_obj in bookList %}
    <tr>
        <td>{{ book_obj.nid }}</td>
        <td>{{ book_obj.title }}</td>
        <td>{{ book_obj.author }}</td>
        <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
        <td>{{ book_obj.price }}</td>
        <td>
            <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">刪除</button></a>
        </td>
    </tr>
{% endfor %}

2、url 分發

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
    url(r'^del/(\d+)', views.delBook),
]

3、視圖函數view實現刪除

def delBook(request,id):
    models.Book.objects.filter(nid=id).delete()
    return redirect("/index/")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM