国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 通過數據庫向Django模型添加字段的示例

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

2020-07-25 11:35Python教程網 Python

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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里所沒有的列的特性。 策略就是現在數據庫里加入字段,然后同步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
2
3
4
5
6
7
8
9
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語句。 語句的具體內容取決與你所使用的數據庫, 大概是這個樣子:

?
1
2
3
4
5
6
7
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
);

 

新加的字段被這樣表示:

?
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
2
3
4
5
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 選項。

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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 网站黄色在线免费观看 | 国产精品国产三级国产aⅴ中文 | 亚洲一区二区在线视频 | 91在线播放视频 | 亚洲欧美一区二区视频 | 中文字幕一区二区三区精彩视频 | 成人羞羞网站 | 亚洲免费a | 日韩视频免费在线观看 | 亚洲久草 | 国产精品久久久久久久久免费桃花 | 午夜视频一区 | 午夜电影网址 | 先锋影音av在线 | 久久久国产精品视频 | 久久av网| av电影免费在线观看 | 免费成人av在线 | 久久视频免费看 | 亚洲第一视频网站 | 在线观看亚洲 | 免费观看在线午夜影视 | 日韩福利视频 | 国产麻豆一区二区三区 | 国产精品久久久久久久久 | 永久看片| 免费观看国产视频在线 | 一级毛片免费看 | 黄站免费 | 中文字幕在线视频观看 | 黄瓜av| 国产精品99久久久久久宅男 | 一级片免费视频 | 国产亚洲一区二区三区 | 国产视频在线播放 | 久久国产成人 | 精品欧美一区二区三区久久久 | 午夜成人免费电影 | 欧美日韩国产精品一区二区 | 欧美一级二级三级视频 | 日本一区二区不卡在线观看 |