django數據models基礎

django數據models基礎

例子

定義一個Persion模型類,包括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是模型的領域。每個字段被指定爲一個類屬性,每個屬性映射到一個數據庫列,上面的Persion模型將創建一個數據庫表,如下所示:

 CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

說明:

  • 表的名稱myapp_person,是自動從某些模型元數據生成的,但可以覆蓋。
  • id爲django自動添加的字段,也可以自己定義。
  • 這個例子的sql是使用了postgersql語法進行格式化的,django會根據settings裏配置的數據庫自動對sql進行格式化。

使用模型

一旦我們定義了數據模型,就要告訴django我們要使用這些模型。這個是通過修改settings裏的配置來添加應用模塊的名字,讓django來執行應用裏的models.py。

如我們在myapp下定義了一個models,我們就需要這樣設置:

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

注意:當我們添加新的模型的時候,需要運行

python manage.py migrate

字段

數據庫中的字段就是有模型中類的豎井來指定的,要注意的是,不要使用字段名稱與modelAPI的關鍵字,如clean,sava,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()

字段類型

模型中的每個字段應該是field類的一個實例,Django使用字段類型來確定一些事情:

  • 列類型,它告訴數據庫儲存什麼類型的數據(如INTEGER,VARCHAR,TEXT)
  • 在呈現表單字段時使用的默認HTML小部件(例如<input type="text">``<select>
  • 最小的驗證要求,用戶Django的管理員和自動生成的表單

更多字段類型:https://docs.djangoproject.com/en/dev/ref/models/fields/#model-field-types

字段選項

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

null

null=True,django將數據庫空值儲存爲null,默認爲Talse

blank

blank=True,該字段被允許爲空白,默認false

注意,blank不同於null,null是純數據庫相關的,而blank是與驗證相關的,如果一個字段有blank=True表單驗證將允許輸入一個空值。如果字段有blank=False,則該字段將被要求。

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'

SHIRT_SIZES第一個參數‘s’是傳過來的值,第二個參數’small‘是保存到數據庫裏的值。

default

字段的默認值,這可以是值,也可以調用對象

help_text

額外的幫助文本將於窗體小部件一起顯示,即使您的子彈在表單上使用,他對文檔也很有用。

primary_key

primary_key=True,該字段是模型的主鍵

如果我們沒有在模型中指定任何字段屬性爲primary_key=True,django將自動添加IntegerField以保存主鍵。

主鍵是隻讀的,如果你要改變主鍵的值,將會生成一個新的對象。如:

>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>

unique

unique = True,在這個表中這個字段必須是唯一的。

自動主鍵字段

默認情況下,Django爲每個模型提供以下字段:

id = models.AutoField(primary_key=True)

這是一個自增的主鍵

如果你想要設置一個自己的主鍵,就在對應的字段屬性裏添加 primary_key = True,django將不會創建默認的主鍵。

詳細字段名

每個字段類型,除了ForeignKey,ManyToManyField和OneToOneField,都可採用可選的第一個位置參數——一個詳細名稱。如果沒有給出詳細的名稱,django將使用字段的屬性名稱自動創建它,將下劃線轉換爲空格。

在這個例子中,詳細名爲“person’s first name”

first_name = models.CharField("person's first name", max_length=30)

在這個例子中,詳細名稱爲“first name”

first_name = models.CharField(max_length=30)

ForeignKey, ManyToManyFieldOneToOneField 要求第一個參數爲模型類,所以詳細名字由verbose_name關鍵字來確定

poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

關係

顯然,關係數據庫的力量在於彼此關聯表。Django提供了定義三種最常見類型的數據庫關係的方式:多對一,多對多和一一對應。

多對一關係

通過使用django.db.models.ForeignKey來定義多對一的關係,使用跟其他的Field類型一樣。

ForeignKey需要一個位置參數:模型相關的類

例如,如果car模型具有Manufacturer,一個Manufacturer製造多個汽車,但每個Car只有個manufacturer,使用一下定義:

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    # ...

多對多關係

通過使用 ManyToManyField來定義多對多的關係

ManyToManyField需要一個位置參數:模型相關的類

例如:一個Pizza有個多個Topping對象,一個Topping也有多個Pizza:

from django.db import models

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

一對一關係

要定義一對一的關係,請使用 OneToOneField。您可以像任何其他Field類型一樣使用它 :將其作爲模型的類屬性。

當對象以某種方式“擴展”另一個對象時,這對對象的主鍵最有用。

OneToOneField 需要一個位置參數:模型相關的類。

例如,如果您正在構建“地方”數據庫,則可以在數據庫中構建非常標準的地址,電話號碼等。然後,如果你想建立的地方頂部的餐館數據庫,而不是重複自己,在複製這些領域Restaurant模型,你可以把RestaurantOneToOneFieldPlace(因爲餐廳“是”的地方;事實上,處理這通常使用 繼承,涉及隱式的一對一關係)。

與之一樣ForeignKey,可以定義遞歸關係,並且可以對尚未定義的模型進行引用

models使用

models.py

class Student(models.Model):
    stu_name = models.CharField(max_length=30)
    stu_no = models.CharField(max_length=20)
    stu_sex = models.CharField(max_length=10)
    stu_age = models.IntegerField()
    stu_birth = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return '%s %s %s %s %s' % (self.stu_name, self.stu_name, self.stu_sex, self.stu_age, self.stu_birth)
 python manage.py migrate
 python manage.py makemigrations
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章