1. django中怎麼動態操作資料庫欄位
django的ORM系統不支持修改刪除欄位的操作,也就是說你在寫模型model文件的時候,比如說定義了這個user表,然後包含欄位telphone定義,你一旦執行了manage.py syncdb 這個操作,就把表結構往資料庫寫死了,如果你之是刪除了model文件的telphone,資料庫是不被重新修改的。這個時候必須用原生sql解決,也就是說自己寫SQL語句讓django執行,這樣的話會出很多問題,也就是說你執行了alter table users drop column telphone之後,你的model文件不知道你已經對users表結構做了修改,這樣會出直接導致django應用的崩潰。所以動態欄位不好做。也可能是我才疏學淺,沒太理解,也許有高人能做到。不過面對ORM這樣的盡量別刪除欄位。
2. django資料庫查詢操作
1.get(**kwargs)
解釋:返回與篩選條件相匹配的Model對象,返回結果有且只有一個。
說明:如果符合條件的對象多於一個拋出MultipleObjectsReturned異常,如果沒有找到拋出DoesNotExist異常
語法:ModelName.objects.get(itemName=itemNameValue)
例子:Author.objects.get(id=1)
3. django怎麼把自己想要的model生成進資料庫
Model是django項目的基礎, 如果一開始沒有好好設計好, 那麼在接下來的開發過程中就會遇到更多的問題. 然而, 大多數的開發人員都容易在缺少思考 的情況下隨意的增加或修改model. 這樣做的後果就是, 在接下來的開發過程中, 我們不得不做出更多努力...
4. Django 中使用model 怎麼查詢不等於某個值的情況
Model是django項目的基礎, 如果一開始沒有好好設計好, 那麼在接下來的開發過程中就會遇到更多的問題. 然而, 大多數的開發人員都容易在缺少思考 的情況下隨意的增加或修改model. 這樣做的後果就是, 在接下來的開發過程中, 我們不得不做出更多努力來修正這些錯誤.
因此, 在修改model時, 一定盡可能的經過充分的考慮再行動! 以下列出的是我們經常用到的一些工具和技巧:
South, 用於數據遷移, 我們會在每個django項目中都用到. 但到django 1.7時, 將會有django.db.migrations代替.
django-model-utils, 用於處理常見的模式, 例如TimeStampedModel.
django-extensions, 主要用到shell_plus命令, 該命令會在shell中自動載入所有的app的model
1. 基本原則
第一, 將model分布於不同的app中. 如果你的django項目中, 有一個app擁有超過20個model, 那麼, 你就應當考慮分拆該app了. 我們推薦每個app擁 有不超過5個model.
第二, 盡量使用ORM. 我們需要的大多數資料庫索引都能通過Object-Relational-Model實現, 且ORM帶給我們許多快捷方式, 例如生成SQL語句, 讀取/更新資料庫時的安全驗證. 因此, 如果能使用簡單的ORM語句完成的, 應當盡量使用ORM. 只有當純SQL語句極大地簡化了ORM語句時, 才使用純SQL語句. 並且, 在寫純SQL語句是, 應當優先考慮使用raw(), 再是extra().
第三, 必要時添加index. 添加db_index=True到model中非常簡單, 但難的是理解何時應該添加. 在建立model時, 我們事先不會添加index, 只有當 以下情況時, 才會考慮添加index:
在所有的資料庫查詢中使用率在10%-25%時
或當有真實的數據, 或能正確估計出使用index後的效果確實滿意時
第四, 注意model的繼承. model的繼承在django中需要十分小心, django提供了三種繼承方式, 1.abstract base class繼承(不要和Pyhton標准庫的abc模塊 搞混), 2.多表(multi-table)繼承, 3.proxy model繼承. 下表羅列了這三種繼承的優劣:
django的創造者和其他許多開發人員都認為, 多表繼承的方法不是一個良好的方法. 因此我們強烈建議大家不要使用該方法. 下面列舉了一些常見的如何 選擇model繼承的情形:
如果只有少數model擁有重復的field時, 大可不必使用model繼承, 只需要在每個model中添加這些相同的field即可.
如果有足夠的model擁有重復的field時, 大多是情況下, 可以使用abstract base class繼承, 將相同的field提取到abstract base class 中.
Proxy model繼承很少被用到, 和其他兩種繼承也有著許多不一樣之處.
請不要使用多表(multi-table)繼承, 因為它既消耗資源又復雜, 如果可以, 盡量使用OneToOneFields和ForeignKeys代替.
django項目中, 創建時間和修改時間這兩個field是最用到的, 下面給出一個abstract base class繼承的例子:
2. Django Model的設計
如何設計出好的django model可能是最難也是最復雜的一個話題了, 在此, 我們看看一些基本的技巧吧:
a. 規范化
我們首先建議了解資料庫規范化(database normalization). 如果你還不清楚這是什麼, 那麼, 我們強烈建議你先閱讀一下相關的書籍, 或搜索"關系 型資料庫設計"或"資料庫規范化". 在創建django model之前, 應當首先保證設計的資料庫是規范化的.
b. cache
正確的使用cache能幫助我們提高資料庫的性能. 詳細的信息, 我們會在今後的文章中作進一步介紹.
c. 何時使用null和blank
當定義model field時, 我們可以設置null=True和blank=True (默認都是False), 知道何時設置null和blank對於開發人員也是十分重要的, 在下 面的表格中, 我們一一列舉了如何使用這兩個選項:
d. 什麼時候使用BinaryField
在django 1.6中, 新增了BinaryField, 用於儲存二進制數據(binary data或 bytes). 對於BinaryField, 我們無法使用ORM的filters, excludes或其他SQL操作. 但在少數情況下, 我們會用到BinaryField, 例如MessagePack格式的內容, 感測器接受的原始數據和壓縮數據等. 但需要注意 的是, Binary Data一般都十分龐大, 因此可能會拖慢資料庫的速度. 如果發生這一現象, 我們可以將binary data儲存在文件中, 然後使用FileField儲 存該文件的路徑信息.
還有, 不要從BinaryField中直接讀取文件並呈獻給用戶. 因為, 1. 從資料庫讀寫總是比從文件系統讀寫慢; 2. 資料庫備份會變得十分龐大, 花費更多 的時間; 3. 獲得文件的過程, 增加了從django到資料庫的這一環節.
3. 不要替換默認的Model Manager
從ORM獲取model, 實際上是通過django中的Model manager完成的, django為每一個model提供了默認的model manager, 我們不建議將其替換掉, 因為:
當使用model繼承時, model會繼承 abstract base class model的model manager, 而不會繼承非abstract base class的manager.
model的第一個model manager通常作為默認的manager, 當被替換時, 可能會發生不可預測的問題.
4. 資料庫事務 (Transaction)
在django 1.6中, ORM默認會autocommit每一個資料庫查詢, 也就是說, 每次使用m.create()或m.update()時, 在資料庫中馬上就會做出相應的修 改. 這樣做的好處就是簡化了初學者對ORM的理解. 但壞處就是, 當一個view中包含兩個資料庫修改, 可能一個成功, 但另一個失敗, 這就可能導致資料庫不 完整, 給我們帶來很大的危險.
解決這一問題的方法就是使用資料庫transaction, 即將一系列資料庫操作包含在一個transaction中, 當其中有一個失敗時, 其他操作也會自動回退. Django 1.6 為我們帶來了一套嶄新的既簡單又強大的transaction機制, 使我們方便的使用資料庫transaction.
a. 將整個http request包裹在transaction中
django給我們提供了一個簡單地方法, 將一個http request中的所有資料庫操作包裹在transaction中:
只需要在資料庫設置中加入'ATOMIC_REQUESTS': True選項, 就能將整個http request包裹在transaction中. 這樣做的好處顯而易見是是安全, 但 壞處則是性能可能會下降, 因此隨著流量的增大, 我們必須採取更針對性的transaction. 其次, 需要注意的是, 回退的只是資料庫的狀態, 而不包括其他費 資料庫項, 例如發送email等. 所以當涉及這些非資料庫項時, 我們應當使用transaction.con_atomic_request()修飾(decorate)這些view:
b. 更明確地transaction控制
更明確地transaction控制意味著提高真題web app的性能, 但也意味著更多的開發時間. 大多數網站下, 由於有限的流量, 使用ATOMIC_REQUESTS已 經足夠. 在使用手動transaction控制時, 應當注意:
不做數據修改的操作, 應當排除在transaction之外
做數據修改的操作, 則應在transaction內
特殊情況下, 可以違反以上兩條
需要注意的是, 當view返回的是django.http.StreamingHttpResponse時, 應當設置ATOMIC_REQUESTS為false, 或使用 transaction.non_atomic_requests將該view修飾. 因為對於view本身, 是可以使用transaction的, 但對於之後生成的response stream觸發的額 外SQL查詢, 會自動變為django默認的autocommit模式.
5. django怎麼使用本機mysql資料庫
step 1:
修改你的django project目錄下的settings.py 文件至如下所示:
其中,'NAME' 對應的 『db_name' 是你事先使用mysql
的命令行提示符創建的資料庫名稱。注意:在django使用資料庫之前,你必須先創建出資料庫,否則會報錯。'USER'對應的'username'
還有 'PASSWORD' 對應的『passwd'
就是你在mysql中創建的用戶名和密碼。如果你有多個的話,隨便填一個就好。'HOST'和'PORT'默認都可以不填。
題外話: 使用用戶名和密碼登錄mysql的方法:
首先,你需要進入 mysql/bin的目錄下,也可以在.bash_profile中設置環境變數:
PATH=/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/Cellar/mysql/5.6.22/bin/
再在prompt輸入 mysql -u username -p, 回車後再輸入 passwd即可
step 2:
然後,在manage.py路徑中使用python manage.py syncdb 試試,結果會提示你錯誤找不到 MySQLdb 這個mole, 為什麼呢, 因為 python manage.py syncdb 命令是這樣工作的:
1. 在project目錄的settings.py的INSTALLED_APPS元組中找到可能需要更新的APP。
2. 找到每一個APP目錄中的models.py (關系定義文件),並針對變化在資料庫中進行更新。
說了這么多,前面那個錯誤 找不到 mole MySQLdb 是什麼意思啊 ?
先給個圖,再解釋:
因為在models.py中定義關系使用的是python,而真正在資料庫中操作形成model當然一定要用sql語句,所以必須要有一些功能模塊
來把python語句轉化成sql語句。如果你使用sqlite的話,由於sqlite和轉化模塊都已經由python內置了,所以直接使用不會發生錯
誤。但是 」mysql語句的轉化模塊「 就需要你手動載入了,這些模塊放在 MySQL-python 中。
我是使用pip 安裝的:
安裝了之後,再使用 python manage.py syncdb就OK啦。
我使用的系統是 OS X,下面是 mysql 默認的安裝路徑
/usr/local/Cellar/mysql/5.6.22/
如果你想知道你的資料庫文件是放在哪裡的,你可以查看mysql_config文件中的ldata變數,這個變數的值就是 默認的資料庫文件夾存儲的路徑。 我的系統中,mysql_config的完整路徑是 :
/usr/local/Cellar/mysql/5.6.22/bin/mysql_config
6. Django model 遇到查詢條件組合比較多的情況下怎麼寫
Model是django項目的基礎,如果一開始沒有好好設計好,那麼在接下來的開發過程中就會遇到的問題.然而,大多數的開發人員都容易在缺少思考的情況下隨意的增加或修改model.這樣做的後果就是,在接下來的開發過程中,我們不得不做出努力來修正這些錯誤.因此,在修改model時,一定盡可能的經過充分的考慮再行動!以下列出的是我們經常用到的一些工具和技巧:South,用於數據遷移,我們會在每個django項目中都用到.但到django1.7時,將會有django.db.migrations代替.django-model-utils,用於處理常見的模式,例如TimeStampedModel.django-extensions,主要用到shell_plus命令,該命令會在shell中自動載入所有的app的model1.基本原則第一,將model分布於不同的app中.如果你的django項目中,有一個app擁有超過20個model,那麼,你就應當考慮分拆該app了.我們推薦每個app擁有不超過5個model.第二,盡量使用ORM.我們需要的大多數資料庫索引都能通過Object-Relational-Model實現,且ORM帶給我們許多快捷方式,例如生成SQL語句,讀取/更新資料庫時的安全驗證.因此,如果能使用簡單的ORM語句完成的,應當盡量使用ORM.只有當純SQL語句極大地簡化了ORM語句時,才使用純SQL語句.並且,在寫純SQL語句是,應當優先考慮使用raw(),再是extra().第三,必要時添加index.添加db_index=True到model中非常簡單,但難的是理解何時應該添加.在建立model時,我們事先不會添加index,只有當以下情況時,才會考慮添加index:在所有的資料庫查詢中使用率在10%-25%時或當有真實的數據,或能正確估計出使用index後的效果確實滿意時第四,注意model的繼承.model的繼承在django中需要十分小心,django提供了三種繼承方式,1.abstractbaseclass繼承(不要和Pyhton標准庫的abc模塊搞混),2.多表(multi-table)繼承,3.proxymodel繼承.
7. 如何查看在Django模型創建的SQL語句
Django提供了sql,sql_all命令來生成MODEL的SQL語句,當定義好Django Model後,可以在初始化調用Syncdb方法來自動在資料庫裡面生成相應的表。
Model定義如下:
class TestModel(models.Model):
Name=models.CharField(max_length=64,blank=True)
>>> from django.core.management.color import no_style
#Style是用來輸出語句時著色的
>>> from django.db import connection
>>> from django.db.backends import creation
#這裡面有個類BaseDatabaseCreation,就是用來生成SQL語句的。
>>> T=TestModel()
>>> c=creation.BaseDatabaseCreation(connection)
>>>c.sql_create_model(T,no_style())[0]
['CREATE TABLE "abc" (\n "id" integer NOT NULL PRIMARY KEY,\n "Theme" varchar(64) NOT NULL\n)\n;']
8. django 單個models 可以定義多少個表
首先題主用的Django版本是什麼,django貌似沒見過ForeignModel,根據orm,ForeignKey實際上就是sql裡面的外鍵,個人理解樓主的題目是能不能一個欄位對應多個其他表,如下:
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey((ModelA,ModelB,))
這是不科學的啊親,對於sql來說也不會一個欄位能對應多個外鍵,想實現這種效果只能是有一張ModelA,ModelB的中間表,而filed的外鍵對應這張中間表
class MiddleTable(models.Model):
model_a = models.ForeignKey(ModelA)
model_b = models.ForeignKey(ModelB)
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey(MiddleTable)
簡單的說就是ModelA和ModelB有一個多對多的關系,上面的方法是顯示的指明一個MiddleTable表,實時上可以使用Django裡面的ManyToMany,ManyToMany的實際上會建一張中間表,因此你可以在ModelA或ModelB建立一個ManyToMany的欄位,具體ManyToMany的用法請查閱文檔。
class ModelA(models.Model):
model_bs = ManyToMany(ModelB)
class WhatAreYouTryToAsk:
filed_XXX = models.ForeignKey(ModelA)
# or this, 具體實現看需求
# filed_XXX = models.ForeignKey(ModelB)
9. Python中,django框架模式有什麼
Django發布於2005年,是當前Python世界裡最負盛名且成熟的網路框架,最初用來製作在線新聞的Web站點。
Django是一個用Python編寫的開放源代碼的Web應用框架,採用了MVC的框架模式,也有很多人把它稱為MVT模式。
優點:
功能完善且要素齊全:自帶大量常用的工具和框架,適合快速開發企業級網站;
完善的文檔:經過十多年的發展和完善,Django有廣泛的實踐案例和完善的在線文檔,開發者遇到問題可以搜索在線文檔尋求解決方案;
強大的資料庫訪問組件:Django的Model層自帶資料庫ORM組件,使得開發者無需學習SQL語言即可對資料庫進行操作;
先進的APP設計理念:APP是可插拔的,是不可多得的思想,不需要了可以直接刪除,對系統整體影響不大;
自帶台管理系統admin:只需要通過簡單幾行配置和代碼就可以實現一個完整的後台數據管理控制平台。
缺點:
大包大攬:對比flask框架來講,Django不夠輕便,包括的功能太多了;
過度封裝:很多類和方法都封裝了,直接使用比較簡單,改動比較困難;
性能劣勢:Django性能偏低;
模板問題:Django的模板實現了代碼和樣式完全分離,不允許模板里出現Python代碼,靈活度對某些程序員來說可能不夠。
10. Django裡面怎麼實現資料庫視圖啊 就是虛擬表
正經回答:先在資料庫中建立好視圖,然後django中建立對應的model。表所對應的類下面再建立一個Meta類,大致如下
classViewModel(models.Model):
"""這個model類對應你所建立好的視圖"""
classMeta(object):
"""同理,該方法可用於使用mysql中任何已有的表,不僅是視圖"""
db_table='your_view'#顯式指定表名,也就是你建立的視圖的名字
managed=false#默認是ture,設成falsedjango將不會執行建表和刪表操作
#建立欄位間的映射
#需要注意的是,必須設一個欄位為主鍵
#不然django會自動創建一個id欄位為主鍵,引發錯誤
網路知道越來越辣雞了,全是答非所問的。