1. 程式人生 > >Django 2.0 之Models(模型) 官方文件翻譯(一)

Django 2.0 之Models(模型) 官方文件翻譯(一)

以下翻譯是自己學習的時候順便記下的,如果有不對的地方還請指正。

模型是關於你的資料的唯一、確定的資料來源。它包含你所儲存的資料的基本欄位和行為。通常,每個模型對映到一個數據庫表。

基礎知識:

  • 每一個模型都是一個Python類,它是 django.db.models.Model 的子類
  • 模型的每個屬性都表示一個數據庫欄位
  • 通過所有這些,Django提供了一個自動生成的資料庫訪問API;參見

舉個簡單的例子:

下面這個示例模型定義了一個Person模型,它具有first_name和last_name兩個屬性。

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
first_name和last_name是Person模型的欄位。每個欄位被指定為一個類屬性,每個屬性對映到一個數據庫列。

上面的Person模型將建立這樣的資料庫表

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);
一些技術說明:
  • 表的名稱myapp_person是由一些模型元資料自動派生出來的,但是可以重寫。更多細節見
  • 本例中的CREATE TABLE SQL使用PostgreSQL語法進行了格式化,但是值得注意的是Django使用了針對
    settings file
    中指定的資料庫後端定製的SQL語句

使用模型

一旦你定義好了模型,你就需要告訴Django你將使用這些模型。通過編輯你的配置檔案(settings)並修改INSTALLED_APPS設定來新增包含在你的models.py中的模組的名稱。

例如,如果你的應用程式的模型位於myapp.models中(由manage.py startapp命令自動建立的包結構),修改後,INSTALLED_APPS部分看上去應該是這樣:

INSTALLED_APPS = [
    #...
    'myapp',
    #...
]

當你為INSTALLED_APPS新增新應用時,一定要執行 manage.py migrate 命令,必要的時候可以先使用 manage.py makemigrations 命令生成遷移指令碼。

欄位

模型中最重要的部分——也是模型中唯一需要的部分是它定義的資料庫欄位的列表。欄位由類屬性指定,注意不要選擇與models API衝突的欄位名稱,比如clean、save或delete。

例子:

from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()
欄位型別
  • 資料表中列的型別,它告訴資料庫儲存什麼型別的資料(例如,INTEGER、VARCHAR、TEXT)。
  • 在渲染表單欄位時使用預設的HTML widget(例如<input type="text">,<select>)。
  • 在Django的管理和自動生成的表單中使用的最小驗證要求。
Django有幾十個內建的欄位型別,你可以在model field reference中找到完整的列表。如果Django的內建欄位型別不能滿足你的需求,你也可以很容易地編寫自己的欄位,參見Writing custom model fields


欄位選項

每個欄位都有一組特定的欄位引數(在模型欄位參考中有記錄),例如, CharField(及其子類)需要一個 max_length引數,該引數用於指定VARCHAR資料庫欄位在資料庫中儲存的欄位大小

還有一組適用於所有欄位型別的通用引數,都是可選的。它們在參考文獻中得到了充分的解釋,但這裡有一個關於最常用的引數的快速摘要:

null如果為 True, Django在資料庫中把空值儲存為 NULL 。預設為 False.blank

如果為 True,則允許欄位為空。預設為 False.

請注意,這是與nul不同的。null 是純粹與資料庫相關的,而blank 是與驗證相關的。如果一個欄位擁有引數,表單驗證將允許一個空的值。如果欄位 blank=False,那麼欄位將是必須的。

choices

一個可迭代的(例如,一個列表或者元組)2元元組作為該欄位的可選項, 如果是給定的, 預設表單小部件將是一個可選框,而不是一個標準的文字欄位,而且可選項將被限定為給定的可選內容。

選擇列表如下所示:

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)
每個tuple中的第一個元素是將儲存在資料庫中的值。第二個元素由欄位的表單小部件顯示。

給定一個模型例項,一個帶有choices屬性的欄位的顯示值可以使用方法來訪問。例如:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
default欄位的預設值。這可以是一個值或一個可呼叫的物件。如果可呼叫,則每次建立新物件時都會呼叫它。primary_key

如果為 True,那麼該欄位將是模型的主鍵。

如果你沒個給模型中的任何欄位指定

主鍵欄位是隻讀的,如果你修改現有物件上主鍵的值並儲存,將會在原有的物件旁邊建立一個新的物件。例如:

from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>




#待續。