- Pycharm 2017.3.3
- Django 1.11.6
- Python 3.5.2
一. 建立model类型
# 从 Django 中引入 models
from django.db import models
# Create your models here.
见下面的实例
这是实例会涉及到多对多, 一对多. 一对一
创建数据库 makemigrations app 和 migrate app
1.字段参数
下面列举一下目前笔者在开发中用到的一些字段:
max_length:指定字段的长度值,接受一个数字,CharField 必须指定最大长度, TextField 不需要。
verbose_name:字段标签的可读名称,接受一个字符串。如果不指定,Django 会从字段名称去推断默认的详细名称,建议每一个字段都进行指定。
default:字段默认值。
null:是否可以为 null,接受 True 或者 False。
blank: 是否可以为空,同样接受 True 或者 False。
primary_key:如果设置为 Ture,则该字段置为模型主键,如果模型中没有指定主键,则 Django 会自动为模型添加一个主键,默认为 id。
help_text:为 HTML 表单文本提供单文本标签。
choices:一组字段选项,提供这一项的时候,默认对应的表单不见是选择字段的盒子,而不是标准文本字段。
2.字段类型
CharField:用来定义短到中等长度的字段字符串,必须指定 max_length 属性。
TextField:用于大型的任意长度字符串,不强制要求指定 max_length 属性, 仅仅当该字段以表单显示才会使用,不会在数据库级别进行强制执行。
IntegerField:用于存储整形数据,在用于表单中验证输入的值需要时整数。
FloatField:用于存储浮点型数据
DateField 和 DateTimeField:用于存储/表示日期和日期/时间信息(分别是Python.datetime.date和datetime.datetime对象。
这些字段可以另外表明(互斥)参数
auto_now=Ture (在每次保存模型时将该字段设置为当前日期),
auto_now_add(仅设置模型首次创建时的日期)
default(设置默认日期,可以被用户覆盖)。一般笔者选择的默认日期是 datetime.now。需要引用datetime模块
EmailField:用来存储和验证电子邮件地址。
FileField:用于上传文件,需要提供 upload_to 指定上传到的地方。
ImageField:和上传文件表现基本相似,会额外进行是否为图像的验证。
AutoField:是一种 IntegerField 自增的特殊类型,如果模型没有指定主键的话,此类型的主键将自动添加到模型中。
ForeignKey:外键,用于指定与另一个数据库模型的一对多关系。关系 “一” 侧是包含密钥的模型。和 flask 指定外键的方式不同。
ManyToManyField:用于指定多对多关系,例如,一本书可以有几种类型,每种类型可以包含几本书)。
在我们的图书馆应用程序中,我们将非常类似地使用它们ForeignKeys,但是可以用更复杂的方式来描述组之间的关系。
这些具有参数on_delete来定义关联记录被删除时会发生什么(例如,值models.SET_NULL将简单地设置为值NULL)。笔者用的不是很多。
通过声明 class Meta 来声明模型级别的元数据
一个模型也可以有方法,最基本的使用就是定义一个标准的 Python 类方法: __str__:
# 完整的 model
class Department(models.Model):
d_id = models.AutoField(primary_key=True)
d_name = models.CharField(max_length=30)
class Meta:
verbose_name = u"部门"
verbose_name_plural = verbose_name
def __str__(self):
return 'Department<d_id=%s,d_name=%s>'%(
self.d_id,self.d_name
)
class Student(models.Model):
s_id = models.AutoField(primary_key=True)
s_name = models.CharField(max_length=30)
department = models.ForeignKey('Department')
course = models.ManyToManyField('Course')
def __str__(self):
return 'Student<s_id=%s,s_name=%s>'%(
self.s_id,self.s_name
)
class Course(models.Model):
c_id = models.AutoField(primary_key=True)
c_name = models.CharField(max_length=30)
def __str__(self):
return 'Course<c_id=%s,c_name=%s>'%(
self.c_id,self.c_name
)
class Stu_detail(models.Model):
s_id = models.OneToOneField('Student')
age = models.IntegerField()
gender = models.BooleanField(default=1)
country = models.CharField(max_length=30,null=True)
def __str__(self):
return 'Stu_detail<s_id=%s,age=%s,gender=%s,country=%s>'%(
self.s_id,self.age,self.gender,self.country)
存数据 可以利用实例化时候存取数据 对应相应的字段,然后保存.
from django.shortcuts import render # 引入 render 方法
from .models import Department, Student, Course, Stu_detail # 引入之前配置好的 Model
......
读取数据..
# {BASE_DIR/apps/message/views.py}
from django.shortcuts import render
from school.models import Department, Student, Course, Stu_detail
# Create your views here.
class Index(View):
def get(self, request):
# 在只有两级的查询,如Student,Department之间的查询
# Department查询Student的信息
students = Student.objects.all()filter(d_id=int(department的id))
# Student查询Department的信息
department= Department.objects.all()filter(d_id=int(department的id))
pass