模型文檔地址
https://docs.djangoproject.com/en/3.0/topics/db/models/
實踐是檢驗真理的唯一標(biāo)準(zhǔn)
上一篇文檔,我們把這個模型的流程,通過pycharm走通了,那么,我們現(xiàn)在就可以根據(jù)官方文檔,碼代碼了。
1、ORM設(shè)計思想
即Object-Relationl Mapping,它的作用是在關(guān)系型數(shù)據(jù)庫和對象之間作一個映射,可以認(rèn)為,django通過models將python語言翻譯成了數(shù)據(jù)庫執(zhí)行語句 。
例如,下面的代碼1和代碼2是等價的:
代碼1(python):
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
代碼2(sql):
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
2、django的模型使用
上一篇文檔中,我們在使用模型上遇到了一些坑,其中一個是要把應(yīng)用進(jìn)行注冊才能使用模型。這點在官方文檔也是說明了的:
Once you have defined your models, you need to tell Django you’re going to use those models. Do this by editing your settings file and changing the INSTALLED_APPS setting to add the name of the module that contains your models.py.
3、字段
Django附帶了幾十個內(nèi)置字段類型,可以在模型字段引用中找到完整的列表。如果Django的內(nèi)置字段不能實現(xiàn)這個功能,也可以很容易地編寫自己的字段。
字段類型:https://docs.djangoproject.com/en/3.0/ref/models/fields/#model-field-types
自定義:https://docs.djangoproject.com/en/3.0/howto/custom-model-fields/
(1)字段的參數(shù)定義(這里截取上一個文檔的例子):
loginname = models.CharField(max_length=20, null=False, unique=True)
如上,對于字段有一些通用參數(shù):
@參數(shù) null:
為True,將空值存儲為NULL,否則不存儲
@參數(shù)blank:
為True,允許輸入空值;為False,則必填
@參數(shù)choices:
YEAR_IN_SCHOOL_CHOICES = [
(‘FR’, ‘Freshman’),
(‘SO’, ‘Sophomore’),
(‘JR’, ‘Junior’),
(‘SR’, ‘Senior’),
(‘GR’, ‘Graduate’),
]
用于頁面上的選擇框標(biāo)簽,models提供一個二維的二元元組,第一個元素表示存在數(shù)據(jù)庫內(nèi)真實的值,第二個表示頁面上顯示的具體內(nèi)容。
@參數(shù)default:
字段的默認(rèn)值。它可以是值或可調(diào)用對象。
@參數(shù)help_text:
把鼠標(biāo)放到頁面部件上,會顯示
@參數(shù)primary_key:
如果為True,自定義該字段為模型的主鍵,屬性為只讀。 django會自動添加一個IntegerField來保存主鍵,即id:
id = models.AutoField(primary_key=True)
@參數(shù)unique:
如果為真,則該字段必須在整個表中唯一。
@參數(shù)primary_key:
django默認(rèn)生成主鍵id:
id = models.AutoField(primary_key=True)
@參數(shù)verbose_name
django自動創(chuàng)建字段名稱 verbose_name
自定義:
first_name = models.CharField(verbose_name=“person’s first name”, max_length = 30)
默認(rèn)自動填寫:
first_name = models.CharField( max_length = 30)
其中,F(xiàn)oreignKey, ManyToManyField 和OneToOneField沒有該參數(shù)。而且,Django會自動將第一個字母大寫(哪怕是自定義的)。
3、關(guān)系
Django提供了定義三種最常見的數(shù)據(jù)庫關(guān)系類型的方法:多對一、多對多和一對一。
(1)多對一例子
class Manufacturer(models.Model):
# ...
pass
class Car(models.Model):
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
(2)多對多例子
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
(3)一對一例子
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name
class Waiter(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
name = models.CharField(max_length=50)
def __str__(self):
return "%s the waiter at %s" % (self.name, self.restaurant)