最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過數(shù)據(jù)庫向Django模型添加字段的示例

 更新時間:2015年07月21日 10:51:20   投稿:goldensun  
這篇文章主要介紹了通過數(shù)據(jù)庫向Django模型添加字段的示例,Django是人氣最高的Python web開發(fā)框架,需要的朋友可以參考下

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

from django.db import models

class Publisher(models.Model):
  name = models.CharField(max_length=30)
  address = models.CharField(max_length=50)
  city = models.CharField(max_length=60)
  state_province = models.CharField(max_length=30)
  country = models.CharField(max_length=50)
  website = models.URLField()

  def __unicode__(self):
    return self.name

class Author(models.Model):
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=40)
  email = models.EmailField()

  def __unicode__(self):
    return u'%s %s' % (self.first_name, self.last_name)

class Book(models.Model):
  title = models.CharField(max_length=100)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  publication_date = models.DateField()

  def __unicode__(self):
    return self.title


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

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

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

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

    在你的模型里添加字段。

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

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

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

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

    啟動數(shù)據(jù)庫的交互界面。

    執(zhí)行在開發(fā)環(huán)境步驟中,第三步的ALTER TABLE語句。

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

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

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

class Book(models.Model):
  title = models.CharField(max_length=100)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher)
  publication_date = models.DateField()
  **num_pages = models.IntegerField(blank=True, null=True)**

  def __unicode__(self):
    return self.title


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

CREATE TABLE "books_book" (
  "id" serial NOT NULL PRIMARY KEY,
  "title" varchar(100) NOT NULL,
  "publisher_id" integer NOT NULL REFERENCES "books_publisher" ("id"),
  "publication_date" date NOT NULL,
  "num_pages" integer NULL
);

新加的字段被這樣表示:

"num_pages" integer NULL

接下來,我們要在開發(fā)環(huán)境上運行數(shù)據(jù)庫客戶端,如果是PostgreSQL,運行 psql,,然后,我執(zhí)行如下語句。

ALTER TABLE books_book ADD COLUMN num_pages integer;

添加 非NULL 字段

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

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

BEGIN;
ALTER TABLE books_book ADD COLUMN num_pages integer;
UPDATE books_book SET num_pages=0;
ALTER TABLE books_book ALTER COLUMN num_pages SET NOT NULL;
COMMIT;

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

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

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

如果沒有異常發(fā)生,我們將切換到生產服務器,然后在生產環(huán)境的數(shù)據(jù)庫中執(zhí)行命令ALTER TABLE 然后我們更新生產環(huán)境中的模型,最后重啟web服務器。

相關文章

  • Python使用scipy模塊實現(xiàn)一維卷積運算示例

    Python使用scipy模塊實現(xiàn)一維卷積運算示例

    這篇文章主要介紹了Python使用scipy模塊實現(xiàn)一維卷積運算,結合實例形式分析了scipy模塊的功能及使用scipy模塊進行一維卷積運算的相關操作技巧,需要的朋友可以參考下
    2019-09-09
  • python字典的常用操作方法小結

    python字典的常用操作方法小結

    下面小編就為大家?guī)硪黄猵ython字典的常用操作方法小結。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧
    2016-05-05
  • python缺失值的解決方法總結

    python缺失值的解決方法總結

    在本篇文章里小編給大家整理的是一篇關于python缺失值的解決方法總結,有需要的朋友們可以跟著學習下。
    2021-06-06
  • OpenCV圖像縮放resize各種插值方式的比較實現(xiàn)

    OpenCV圖像縮放resize各種插值方式的比較實現(xiàn)

    OpenCV提供了resize函數(shù)來改變圖像的大小,本文主要介紹了OpenCV圖像縮放resize各種插值方式的比較實現(xiàn),分享給大家,感興趣的可以了解一下
    2021-06-06
  • 簡單談談Python中的幾種常見的數(shù)據(jù)類型

    簡單談談Python中的幾種常見的數(shù)據(jù)類型

    Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創(chuàng)建。在 Python 中,變量就是變量,它沒有類型,我們所說的"類型"是變量所指的內存中對象的類型。
    2017-02-02
  • 使用Pandas對列名和索引進行重命名的幾種常見方法

    使用Pandas對列名和索引進行重命名的幾種常見方法

    在數(shù)據(jù)分析和處理中,Pandas是一個非常強大的工具,它提供了靈活的數(shù)據(jù)結構和豐富的操作方法,使得數(shù)據(jù)處理變得更加簡單高效,其中,對數(shù)據(jù)的列名和索引進行重命名是常見的需求之一,本文將從基礎概念出發(fā),逐步深入探討如何使用Pandas對列名和索引進行重命名
    2024-12-12
  • python全棧要學什么 python全棧學習路線

    python全棧要學什么 python全棧學習路線

    在本文中小編給大家整理了關于python全棧要學什么以及python全棧學習路線的知識點內容,需要的朋友們參考下。
    2019-06-06
  • 一文帶你搞懂Python中isinstance和type的區(qū)別

    一文帶你搞懂Python中isinstance和type的區(qū)別

    在Python中,我們經常需要檢查一個對象的類型,Python提供了兩種方法來獲取對象的類型:isinstance和type,這兩種方法有什么區(qū)別呢,本文將詳細介紹這兩種方法的區(qū)別和使用,需要的朋友可以參考下
    2023-06-06
  • Python hashlib和hmac模塊使用方法解析

    Python hashlib和hmac模塊使用方法解析

    這篇文章主要介紹了Python hashlib和hmac模塊使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • python識別圖像并提取文字的實現(xiàn)方法

    python識別圖像并提取文字的實現(xiàn)方法

    這篇文章主要介紹了python識別圖像并提取文字的實現(xiàn)方法,
    2019-06-06

最新評論

连城县| 敦化市| 松滋市| 金溪县| 盐津县| 中阳县| 上杭县| 务川| 乐安县| 天长市| 体育| 金平| 东兰县| 铜鼓县| 喀什市| 镇康县| 广饶县| 肥乡县| 保康县| 鸡东县| 织金县| 泰州市| 荥阳市| 南陵县| 乐东| 泉州市| 云龙县| 镇雄县| 邳州市| 祁阳县| 普格县| 尼勒克县| 五原县| 五台县| 军事| 银川市| 安塞县| 马边| 福泉市| 衡山县| 黑河市|