亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

通過數據庫向Django模型添加字段的示例

2020-01-04 18:01:10
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了通過數據庫向Django模型添加字段的示例,Django是人氣最高的Python web開發框架,需要的朋友可以參考下

首先借用書本(book)的這個數據模型:

 

  1. from django.db import models 
  2.  
  3. class Publisher(models.Model): 
  4. name = models.CharField(max_length=30) 
  5. address = models.CharField(max_length=50) 
  6. city = models.CharField(max_length=60) 
  7. state_province = models.CharField(max_length=30) 
  8. country = models.CharField(max_length=50) 
  9. website = models.URLField() 
  10.  
  11. def __unicode__(self): 
  12. return self.name 
  13.  
  14. class Author(models.Model): 
  15. first_name = models.CharField(max_length=30) 
  16. last_name = models.CharField(max_length=40) 
  17. email = models.EmailField() 
  18.  
  19. def __unicode__(self): 
  20. return u'%s %s' % (self.first_name, self.last_name) 
  21.  
  22. class Book(models.Model): 
  23. title = models.CharField(max_length=100) 
  24. authors = models.ManyToManyField(Author) 
  25. publisher = models.ForeignKey(Publisher) 
  26. publication_date = models.DateField() 
  27.  
  28. def __unicode__(self): 
  29. return self.title 

添加字段

當要向一個產品設置表(或者說是model)添加一個字段的時候,要使用的技巧是利用Django不關心表里是否包含model里所沒有的列的特性。 策略就是現在數據庫里加入字段,然后同步Django的模型以包含新字段。

然而 這里有一個雞生蛋蛋生雞的問題 ,由于要想了解新增列的SQL語句,你需要使用Django的 manage.py sqlall命令進行查看 ,而這又需要字段已經在模型里存在了。 (注意:你并 不是非得使用與Django相同的SQL語句創建新的字段,但是這樣做確實是一個好主意 ,它能讓一切都保持同步。)

這個雞-蛋的問題的解決方法是在開發者環境里而不是發布環境里實現這個變化。 (你正使用的是測試/開發環境,對吧?)下面是具體的實施步驟。

首先,進入開發環境(也就是說,不是在發布環境里):

在你的模型里添加字段。

運行 manage.py sqlall [yourapp] 來測試模型新的 CREATE TABLE 語句。 注意為新字段的列定義。

開啟你的數據庫的交互命令界面(比如, psql 或mysql , 或者可以使用 manage.py dbshell )。 執行 ALTER TABLE 語句來添加新列。

使用Python的manage.py shell,通過導入模型和選中表單(例如, MyModel.objects.all()[:5] )來驗證新的字段是否被正確的添加 ,如果一切順利,所有的語句都不會報錯。

然后在你的產品服務器上再實施一遍這些步驟。

啟動數據庫的交互界面。

執行在開發環境步驟中,第三步的ALTER TABLE語句。

將新的字段加入到模型中。 如果你使用了某種版本控制工具,并且在第一步中,已經提交了你在開發環境上的修改,現在,可以在生產環境中更新你的代碼了(例如,如果你使用Subversion,執行svn update。

重新啟動Web server,使修改生效。

讓我們實踐下,比如添加一個num_pages字段到第五章中Book模型。首先,我們會把開發環境中的模型改成如下形式:

 

 
  1. class Book(models.Model): 
  2. title = models.CharField(max_length=100) 
  3. authors = models.ManyToManyField(Author) 
  4. publisher = models.ForeignKey(Publisher) 
  5. publication_date = models.DateField() 
  6. **num_pages = models.IntegerField(blank=True, null=True)** 
  7.  
  8. def __unicode__(self): 
  9. return self.title 

然后,我們運行命令manage.py sqlall books 來查看CREATE TABLE語句。 語句的具體內容取決與你所使用的數據庫, 大概是這個樣子:

 

 
  1. CREATE TABLE "books_book" ( 
  2. "id" serial NOT NULL PRIMARY KEY, 
  3. "title" varchar(100) NOT NULL, 
  4. "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"), 
  5. "publication_date" date NOT NULL, 
  6. "num_pages" integer NULL 
  7. ); 

新加的字段被這樣表示:

 

 
  1. "num_pages" integer NULL 

接下來,我們要在開發環境上運行數據庫客戶端,如果是PostgreSQL,運行 psql,,然后,我執行如下語句。

 

 
  1. ALTER TABLE books_book ADD COLUMN num_pages integer; 

添加 非NULL 字段

這里有個微妙之處值得一提。 在我們添加字段num_pages的時候,我們使用了 blank=True 和 null=True 選項。 這是因為在我們第一次創建它的時候,這個數據庫字段會含有空值。

然而,想要添加不能含有空值的字段也是可以的。 要想實現這樣的效果,你必須先創建 NULL 型的字段,然后將該字段的值填充為某個默認值,然后再將該字段改為 NOT NULL 型。 例如:

 

 
  1. BEGIN; 
  2. ALTER TABLE books_book ADD COLUMN num_pages integer; 
  3. UPDATE books_book SET num_pages=0; 
  4. ALTER TABLE books_book ALTER COLUMN num_pages SET NOT NULL; 
  5. COMMIT; 

如果你這樣做,記得你不要在模型中添加 blank=True 和 null=True 選項。

執行ALTER TABLE之后,我們要驗證一下修改結果是否正確。啟動python并執行下面的代碼:

 

 
  1. >>> from mysite.books.models import Book 
  2. >>> Book.objects.all()[:5] 

如果沒有異常發生,我們將切換到生產服務器,然后在生產環境的數據庫中執行命令ALTER TABLE 然后我們更新生產環境中的模型,最后重啟web服務器。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品福利观看| 2019国产精品自在线拍国产不卡| 成人精品久久av网站| 国产精品青草久久久久福利99| 国产日韩精品视频| 亚洲精品视频中文字幕| 91精品国产综合久久香蕉| 在线观看日韩专区| 美女福利视频一区| 国产成人一区三区| 国模私拍一区二区三区| 另类视频在线观看| 国产精品一区二区三区久久久| 狠狠操狠狠色综合网| 国产一区香蕉久久| 最近2019年好看中文字幕视频| 精品久久久一区二区| 国产精品久久久精品| 久久久91精品国产| 欧美主播福利视频| 91中文在线观看| 国内精品一区二区三区四区| 国产欧美日韩视频| 日韩欧美中文字幕在线观看| 性欧美xxxx| 久久亚洲成人精品| 国产精品视频yy9099| 欧美激情视频给我| 国产99久久精品一区二区永久免费| 中文字幕日韩高清| 成人精品久久一区二区三区| 狠狠久久五月精品中文字幕| 91成人国产在线观看| 国产美女精品视频| 77777亚洲午夜久久多人| 欧美丰满少妇xxxxx| 国产69精品久久久久久| 亚洲精选中文字幕| 国产精品黄视频| 国产精品极品美女粉嫩高清在线| 91久久精品日日躁夜夜躁国产| 亚洲高清色综合| 国产中文字幕亚洲| 91久久久久久久久久| 日韩在线视频观看正片免费网站| 日韩在线视频线视频免费网站| 91精品久久久久久综合乱菊| 久久九九亚洲综合| 国产精品久久久久一区二区| 亚洲女人天堂av| 日韩免费观看视频| 久久精品99无色码中文字幕| 久久精品国产欧美亚洲人人爽| 亚洲欧美成人一区二区在线电影| 久久久91精品国产一区不卡| 国产v综合ⅴ日韩v欧美大片| 91欧美精品成人综合在线观看| 九九热视频这里只有精品| 精品久久久久久中文字幕一区奶水| 亚洲第一av网| 伊人激情综合网| 久久久综合av| 国产91av在线| 久久综合久久美利坚合众国| 97视频在线观看免费| 国产视频精品一区二区三区| 久久久国产一区二区三区| 久久av在线播放| 欧美激情欧美激情在线五月| 欧美激情视频一区| 亚洲a∨日韩av高清在线观看| 亚洲精品成人久久电影| 91国内精品久久| 久久天堂av综合合色| 欧美成人免费网| 成人在线一区二区| 成人精品一区二区三区电影黑人| 国产不卡精品视男人的天堂| 国产一级揄自揄精品视频| 欧美国产日韩中文字幕在线| 亚洲欧美日韩在线高清直播| 欧美精品videosex牲欧美| 亚洲大尺度美女在线| 91国内揄拍国内精品对白| 国产精品视频男人的天堂| 亚洲自拍高清视频网站| 日韩一区二区久久久| 欧美亚洲一级片| 人九九综合九九宗合| 亚洲精品www久久久| 91精品国产高清久久久久久91| 欧美日韩亚洲精品内裤| 亚洲男人天堂网站| 日韩av大片在线| 亚洲一区二区久久| 欧美日韩国产色视频| 国产精品白丝av嫩草影院| 久久精品中文字幕| 色综合天天综合网国产成人网| 色哟哟亚洲精品一区二区| 欧美激情小视频| 2019国产精品自在线拍国产不卡| 欧美伦理91i| 久久久久久美女| 日韩成人激情在线| 欧美激情视频免费观看| 欧美在线视频在线播放完整版免费观看| 97精品伊人久久久大香线蕉| 大桥未久av一区二区三区| 久久精品免费播放| 久久精品国产清自在天天线| 日韩精品视频免费专区在线播放| 伊人久久久久久久久久久久久| 成人女保姆的销魂服务| 欧美一区二区三区艳史| 97视频在线免费观看| 久久偷看各类女兵18女厕嘘嘘| 欧美日韩中国免费专区在线看| 久久久国产成人精品| 日韩av在线不卡| 久久亚洲国产精品成人av秋霞| 91精品国产乱码久久久久久蜜臀| 北条麻妃在线一区二区| 国产一区香蕉久久| 91精品国产色综合久久不卡98口| 亚洲品质视频自拍网| 久久亚洲一区二区三区四区五区高| 一区二区三区在线播放欧美| 亚洲国产小视频| 97欧美精品一区二区三区| 欧日韩在线观看| 亚洲国产高潮在线观看| 欧美性视频网站| 亚洲最大福利网站| 国产精品男人的天堂| 国产亚洲一区二区精品| 色吧影院999| 亚洲日韩欧美视频| 亚洲一区二区久久久久久久| 久久免费视频在线观看| 热久久免费国产视频| 亚洲а∨天堂久久精品喷水| 日韩免费在线电影| 欧美成人亚洲成人| 日本精品免费观看| 国产在线视频2019最新视频| 欧美日在线观看| 欧美一区二粉嫩精品国产一线天| 欧美激情视频一区二区| 色av吧综合网| 91久久精品美女高潮| 亚洲精品美女久久| 久久91亚洲精品中文字幕奶水| 国产成人精品在线播放| 在线看欧美日韩| 亚洲精品免费在线视频| 91免费精品国偷自产在线| 欧亚精品中文字幕| 欧美日韩亚洲激情| 国产亚洲欧洲在线| 欧美高清在线观看| 精品女同一区二区三区在线播放| 久久精品久久久久| 国产成人涩涩涩视频在线观看|