欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

首先借用書本(book)的這個(gè)數(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


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

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

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

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

    在你的模型里添加字段。

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

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

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

然后在你的產(chǎn)品服務(wù)器上再實(shí)施一遍這些步驟。

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

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

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

    重新啟動(dòng)Web server,使修改生效。

讓我們實(shí)踐下,比如添加一個(gè)num_pages字段到第五章中Book模型。首先,我們會(huì)把開發(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


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

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)境上運(yùn)行數(shù)據(jù)庫客戶端,如果是PostgreSQL,運(yùn)行 psql,,然后,我執(zhí)行如下語句。

ALTER TABLE books_book ADD COLUMN num_pages integer;

添加 非NULL 字段

這里有個(gè)微妙之處值得一提。 在我們添加字段num_pages的時(shí)候,我們使用了 blank=True 和 null=True 選項(xiàng)。 這是因?yàn)樵谖覀兊谝淮蝿?chuàng)建它的時(shí)候,這個(gè)數(shù)據(jù)庫字段會(huì)含有空值。

然而,想要添加不能含有空值的字段也是可以的。 要想實(shí)現(xiàn)這樣的效果,你必須先創(chuàng)建 NULL 型的字段,然后將該字段的值填充為某個(gè)默認(rèn)值,然后再將該字段改為 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 選項(xiàng)。

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

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

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

相關(guān)文章

  • python實(shí)現(xiàn)漢諾塔算法

    python實(shí)現(xiàn)漢諾塔算法

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)漢諾塔算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 使用Python操作MySQL數(shù)據(jù)庫的教程詳解

    使用Python操作MySQL數(shù)據(jù)庫的教程詳解

    在這篇文章中,主要為大家詳細(xì)介紹如何在Python中使用pymysql模塊來操作MySQL數(shù)據(jù)庫,文中的示例代碼簡介易懂,需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • python3 property裝飾器實(shí)現(xiàn)原理與用法示例

    python3 property裝飾器實(shí)現(xiàn)原理與用法示例

    這篇文章主要介紹了python3 property裝飾器實(shí)現(xiàn)原理與用法,結(jié)合實(shí)例形式分析了Python3 property裝飾器功能、原理及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2019-05-05
  • python中日期和時(shí)間格式化輸出的方法小結(jié)

    python中日期和時(shí)間格式化輸出的方法小結(jié)

    這篇文章主要介紹了python中日期和時(shí)間格式化輸出的方法,實(shí)例總結(jié)了Python常見的日期與事件操作技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03
  • python調(diào)用matlab的m自定義函數(shù)方法

    python調(diào)用matlab的m自定義函數(shù)方法

    今天小編就為大家分享一篇python調(diào)用matlab的m自定義函數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python中刪除某個(gè)元素的方法解析

    python中刪除某個(gè)元素的方法解析

    這篇文章主要介紹了python中刪除某個(gè)元素的方法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法

    完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法

    這篇文章主要介紹了完美解決torch.cuda.is_available()一直返回False的玄學(xué)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • django框架面向?qū)ο驩RM模型繼承用法實(shí)例分析

    django框架面向?qū)ο驩RM模型繼承用法實(shí)例分析

    這篇文章主要介紹了django框架面向?qū)ο驩RM模型繼承用法,結(jié)合實(shí)例形式分析了Django框架ORM模型抽象類繼承、多表繼承及代理模型繼承三種繼承方式實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 淺談python3.6的tkinter運(yùn)行問題

    淺談python3.6的tkinter運(yùn)行問題

    今天小編就為大家分享一篇淺談python3.6的tkinter運(yùn)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python中Genarator函數(shù)用法分析

    python中Genarator函數(shù)用法分析

    這篇文章主要介紹了python中Genarator函數(shù)用法,實(shí)例分析了Genarator函數(shù)的使用原理與相關(guān)技巧,需要的朋友可以參考下
    2015-04-04

最新評(píng)論