Django中models.model如何使用舉例詳解
前言
在 Django 中,models
是處理數(shù)據(jù)庫的核心工具,允許我們通過定義 Python 類來描述數(shù)據(jù)結(jié)構(gòu),并自動(dòng)生成數(shù)據(jù)庫表。本文將介紹如何使用 Django 的模型來設(shè)計(jì)和操作數(shù)據(jù)庫表。
1. 什么是 Django 模型?
Django 模型是 Python 類,繼承自 django.db.models.Model
類,每個(gè)模型類都對(duì)應(yīng)數(shù)據(jù)庫中的一張表。模型類的屬性定義了表的字段(列),并可以通過各種方法對(duì)表中的數(shù)據(jù)進(jìn)行操作(如添加、刪除、修改和查詢)。
2. 創(chuàng)建一個(gè) Django 模型
假設(shè)我們正在開發(fā)一個(gè)簡(jiǎn)單的應(yīng)用程序,管理坦克的基本信息。我們可以定義一個(gè) Tank
模型來存儲(chǔ)坦克的名字、生命值和速度等屬性。
2.1 定義模型
在 Django 中,你通常會(huì)在應(yīng)用的 models.py
文件中定義模型類。每個(gè)字段都是一個(gè) Field
類型,Django 會(huì)自動(dòng)為每個(gè)字段創(chuàng)建數(shù)據(jù)庫表的相應(yīng)列。
# models.py from django.db import models class Tank(models.Model): name = models.CharField(max_length=100) # 坦克的名字 health = models.IntegerField() # 坦克的生命值 speed = models.FloatField() # 坦克的速度 created_at = models.DateTimeField(auto_now_add=True) # 創(chuàng)建時(shí)間 def __str__(self): return self.name
2.2 字段類型
在模型中,我們定義了不同類型的字段:
CharField(max_length=100)
:用于存儲(chǔ)字符串?dāng)?shù)據(jù),max_length
參數(shù)指定字段的最大長(zhǎng)度。IntegerField()
:用于存儲(chǔ)整數(shù)值。FloatField()
:用于存儲(chǔ)浮動(dòng)小數(shù)點(diǎn)數(shù)。DateTimeField(auto_now_add=True)
:用于存儲(chǔ)日期和時(shí)間,auto_now_add=True
表示每次創(chuàng)建對(duì)象時(shí)自動(dòng)設(shè)置當(dāng)前時(shí)間。
2.3 字符串表示(__str__
)
我們重寫了 __str__
方法,確保在管理界面中或通過查詢時(shí),返回坦克的名稱。
3. 創(chuàng)建數(shù)據(jù)庫表
定義好模型后,Django 會(huì)根據(jù)模型生成數(shù)據(jù)庫表。接下來,我們需要通過遷移操作將模型同步到數(shù)據(jù)庫。
3.1 生成遷移文件
使用以下命令生成遷移文件,Django 會(huì)根據(jù)模型的變化自動(dòng)生成數(shù)據(jù)庫操作腳本:
python manage.py makemigrations
3.2 應(yīng)用遷移
執(zhí)行遷移操作,將模型同步到數(shù)據(jù)庫:
python manage.py migrate
4. 使用模型進(jìn)行數(shù)據(jù)操作
Django 提供了一個(gè)強(qiáng)大的 ORM(對(duì)象關(guān)系映射)系統(tǒng),通過模型類,你可以方便地進(jìn)行增、刪、改、查等操作。
4.1 創(chuàng)建對(duì)象并保存
你可以使用模型類創(chuàng)建新的數(shù)據(jù)記錄,并保存到數(shù)據(jù)庫:
tank = Tank(name="T-34", health=100, speed=50.0) tank.save() # 將對(duì)象保存到數(shù)據(jù)庫
4.2 查詢數(shù)據(jù)
你可以通過模型的 objects
屬性執(zhí)行數(shù)據(jù)庫查詢。Django 提供了多種查詢方法,常見的包括:
all()
:獲取所有記錄。get()
:根據(jù)條件獲取單個(gè)記錄。filter()
:根據(jù)條件過濾記錄。exclude()
:排除某些記錄。
# 獲取所有坦克 tanks = Tank.objects.all() # 獲取 id 為 1 的坦克 tank = Tank.objects.get(id=1) # 獲取速度大于 40 的坦克 fast_tanks = Tank.objects.filter(speed__gt=40) # 排除掉生命值低于 50 的坦克 healthy_tanks = Tank.objects.exclude(health__lt=50)
4.3 更新對(duì)象
查詢到的對(duì)象是可修改的,你可以直接修改其屬性并保存:
tank = Tank.objects.get(id=1) tank.speed = 60.0 # 修改速度 tank.save() # 保存修改
4.4 刪除對(duì)象
你可以刪除數(shù)據(jù)庫中的記錄:
tank = Tank.objects.get(id=1) tank.delete() # 刪除坦克對(duì)象
5. 常見字段類型及參數(shù)
Django 提供了豐富的字段類型,用于處理各種不同類型的數(shù)據(jù)。常見的字段類型及參數(shù)如下:
5.1 CharField
用于存儲(chǔ)字符串,通常用于存儲(chǔ)名稱、標(biāo)題等短文本。
name = models.CharField(max_length=100)
max_length
:字段的最大長(zhǎng)度(必需)。
5.2 IntegerField
用于存儲(chǔ)整數(shù)。
health = models.IntegerField()
null
:如果為True
,該字段可以為空。blank
:如果為True
,該字段可以在表單中為空。
5.3 DateTimeField
用于存儲(chǔ)日期和時(shí)間。
created_at = models.DateTimeField(auto_now_add=True)
auto_now
:每次保存模型時(shí)自動(dòng)設(shè)置為當(dāng)前時(shí)間。auto_now_add
:只在對(duì)象創(chuàng)建時(shí)自動(dòng)設(shè)置為當(dāng)前時(shí)間。
5.4 ForeignKey
表示一對(duì)多關(guān)系。通常用于關(guān)聯(lián)其他模型。
author = models.ForeignKey('Author', on_delete=models.CASCADE)
on_delete
:定義刪除關(guān)聯(lián)對(duì)象時(shí)的行為。常見的選項(xiàng)有:models.CASCADE
:級(jí)聯(lián)刪除,刪除關(guān)聯(lián)對(duì)象時(shí)也刪除當(dāng)前對(duì)象。models.SET_NULL
:將外鍵字段設(shè)置為NULL
。models.PROTECT
:阻止刪除關(guān)聯(lián)對(duì)象。models.SET_DEFAULT
:將外鍵字段設(shè)置為默認(rèn)值。
5.5 ManyToManyField
表示多對(duì)多關(guān)系。適用于多個(gè)模型實(shí)例與多個(gè)其他模型實(shí)例之間的關(guān)系。
authors = models.ManyToManyField('Author')
related_name
:定義反向關(guān)系的名稱。
5.6 BooleanField
用于存儲(chǔ)布爾值(True
或 False
)。
is_active = models.BooleanField(default=True)
default
:設(shè)置字段的默認(rèn)值。
6. 使用模型進(jìn)行遷移和管理
6.1 管理后臺(tái)
Django 提供了內(nèi)置的管理后臺(tái),方便你管理模型數(shù)據(jù)。你只需要在 admin.py
中注冊(cè)你的模型。
# admin.py from django.contrib import admin from .models import Tank admin.site.register(Tank)
6.2 自定義模型管理
你還可以自定義模型的管理方法,來簡(jiǎn)化常見的查詢或操作。例如,你可以通過自定義管理類來添加一些常用的查詢方法:
class TankManager(models.Manager): def fast_tanks(self): return self.filter(speed__gt=50) class Tank(models.Model): name = models.CharField(max_length=100) speed = models.FloatField() objects = TankManager() # 使用自定義的管理類
這樣,你就可以通過 Tank.objects.fast_tanks()
來獲取速度大于 50 的所有坦克。
7. 總結(jié)
Django 的模型是與數(shù)據(jù)庫交互的橋梁。通過定義模型類,你可以輕松地進(jìn)行增、刪、改、查等操作,且無需直接編寫 SQL 語句。通過合理使用模型字段、外鍵、多對(duì)多關(guān)系等功能,你可以構(gòu)建復(fù)雜的數(shù)據(jù)庫結(jié)構(gòu),并高效地管理數(shù)據(jù)。
在實(shí)際應(yīng)用中,你還可以通過自定義方法、查詢集、管理器等擴(kuò)展模型的功能,使得 Django 的 ORM 更加靈活強(qiáng)大。
到此這篇關(guān)于Django中models.model如何使用的文章就介紹到這了,更多相關(guān)Django的models.model使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)簡(jiǎn)單的文字識(shí)別
這篇文章主要為大家詳細(xì)介紹了基于百度云文字識(shí)別API,python實(shí)現(xiàn)的簡(jiǎn)單文字識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11使用Python爬取小姐姐圖片(beautifulsoup法)
這篇文章主要介紹了Python爬取小姐姐圖片(beautifulsoup法),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02新手如何發(fā)布Python項(xiàng)目開源包過程詳解
這篇文章主要介紹了新手如何發(fā)布Python項(xiàng)目開源包過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例
下面小編就為大家?guī)硪黄猵ython 簡(jiǎn)單搭建阻塞式單進(jìn)程,多進(jìn)程,多線程服務(wù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11基于Python實(shí)現(xiàn)商場(chǎng)抽獎(jiǎng)小系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的商場(chǎng)抽獎(jiǎng)小系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08

tensorflow模型文件(ckpt)轉(zhuǎn)pb文件的方法(不知道輸出節(jié)點(diǎn)名)