模型文档地址
https://docs.djangoproject.com/en/3.0/topics/db/models/
实践是检验真理的唯一标准
上一篇文档,我们把这个模型的流程,通过pycharm走通了,那么,我们现在就可以根据官方文档,码代码了。
1、ORM设计思想
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,可以认为,django通过models将python语言翻译成了数据库执行语句 。
例如,下面的代码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的模型使用
上一篇文档中,我们在使用模型上遇到了一些坑,其中一个是要把应用进行注册才能使用模型。这点在官方文档也是说明了的:
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附带了几十个内置字段类型,可以在模型字段引用中找到完整的列表。如果Django的内置字段不能实现这个功能,也可以很容易地编写自己的字段。
字段类型: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)字段的参数定义(这里截取上一个文档的例子):
loginname = models.CharField(max_length=20, null=False, unique=True)
如上,对于字段有一些通用参数:
@参数 null:
为True,将空值存储为NULL,否则不存储
@参数blank:
为True,允许输入空值;为False,则必填
@参数choices:
YEAR_IN_SCHOOL_CHOICES = [
(‘FR’, ‘Freshman’),
(‘SO’, ‘Sophomore’),
(‘JR’, ‘Junior’),
(‘SR’, ‘Senior’),
(‘GR’, ‘Graduate’),
]
用于页面上的选择框标签,models提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容。
@参数default:
字段的默认值。它可以是值或可调用对象。
@参数help_text:
把鼠标放到页面部件上,会显示
@参数primary_key:
如果为True,自定义该字段为模型的主键,属性为只读。 django会自动添加一个IntegerField来保存主键,即id:
id = models.AutoField(primary_key=True)
@参数unique:
如果为真,则该字段必须在整个表中唯一。
@参数primary_key:
django默认生成主键id:
id = models.AutoField(primary_key=True)
@参数verbose_name
django自动创建字段名称 verbose_name
自定义:
first_name = models.CharField(verbose_name=“person’s first name”, max_length = 30)
默认自动填写:
first_name = models.CharField( max_length = 30)
其中,ForeignKey, ManyToManyField 和OneToOneField没有该参数。而且,Django会自动将第一个字母大写(哪怕是自定义的)。
3、关系
Django提供了定义三种最常见的数据库关系类型的方法:多对一、多对多和一对一。
(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)