from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
这段模型层代码在执行的时候其实和MYSQL中创建table的语法功能一致:
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
只不过创建table的名字是(app名字_模型名字),主键会自动创建,所以一般不用自己制定
模型中若是可以为空,则指定blank=True
要是指定下拉框,choices指定是一个二维元祖
YEAR_IN_SCHOOL_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size#这样只会返回类似字典的键
'L'
>>> p.get_shirt_size_display()#这样才会返回对应的值p.get_foo_display()
'Large'
小配件help_text可以指定一个string,到了HTML中会附加在选项后边
抽象基类:
from django.db import models
class CommonInfo(models.Model):
name = models.CharField(max_length=100)
age = models.PositiveIntegerField()
class Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=5)
在一个模型中定义META的abstract为True的话,其它模型类可以直接进行继承,避免了代码重写
from django.db import models
class CommonInfo(models.Model):
# ...
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
# ...
class Meta(CommonInfo.Meta):
db_table = 'student_info'
但是继承的模型类会继承父类META,如果需要更改的话,还需要专门继承后再改写
多个模型类继承之后相当于OnetoOne模式,可以进行跨表访问,通过点出模型名字的方式
多表继承主键需要自己重写,或者直接一对一关联起来