以一个积分系统作为示例
创建模型
首先在app中修改models.py定义两个模型User和Points
from django.db import models
class User(models.Model):
id=models.indexes
username=models.CharField(max_length=200)
password=models.CharField(max_length=200)
role=models.CharField(max_length=200)
class Points(models.Model):
user=models.ForeignKey(User,on_delete=models.CASCADE)
value=models.IntegerField(default=0)
deriver=models.CharField(max_length=500)
每个模型都都被表示为一个Model的子类,其中的每个成员变量表示模型的一个字段。每个字段都是一个Field类的实例,如果不将字段名作为第一个参数传入,就使用变量的名称。有些Field类必须要参数,比如CharField需要max_length来限定长度。使用外键来定义表之间的关系,包括多对一、多对多、一对一。
激活模型
在project的setting.py中注册app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'PointsPlus.apps.PointsplusConfig'
]
运行命令
python manage.py makemigrations PointsPlus
会在app目录下的migrations目录中生成0001_initial.py(数字表示版本,之后会模型进行修改再运行该命令会生成0002)文件,这里保存了Django对模型是如何做改变的,可以进行修改。
运行命令
python manage.py sqlmigrate PointsPlus 0001
该命令只是打印出需要执行的sql语句,并不在数据库上实际运行。自动生成结合了app名称和model名称的表名,自动添加主键id,外键会在字段名称后加_id,外键关系通过FOREIGN KEY约束来显式生成。具体的sql语句和使用的数据库有关。
运行命令
python manage.py migrate
真正执行sql语句。migrate命令执行所有未被应用的migration(在django_migrations表中记录)同步做的改变。
之后就可以使用模型
from PointsPlus import User,Points
u=User(username="admin",password="admin",role="admin")
u.save()
print(u.id)
u.username="admin01"
u.save()
# 所有的user
User.objects.all()
为了能够直观地看到模型的内容和进行更多的修改,我们对模型做一些修改,字段的修改需要再运行migrate,在指定之前记录的join_date是使用timezone.now()
import datetime
from django.db import models
from django.utils import timezone
class User(models.Model):
id=models.indexes
username=models.CharField(max_length=200)
password=models.CharField(max_length=200)
role=models.CharField(max_length=200)
join_date=models.DateTimeField('date joined')
def __str__(self):
return self.id+" "+self.username+" "+self.role
def was_joined_recently(self):
return self.join_date>=timezone.now()-datetime.timedelta(days=1)
class Points(models.Model):
user=models.ForeignKey(User,on_delete=models.CASCADE)
value=models.IntegerField(default=0)
deriver=models.CharField(max_length=500)
def __str__(self):
return self.user.username+" "+self.value+" "+self.deriver
运行命令
python manage.py shell
import django
from PointsPlus.models import User,Points
User.objects.all()
u=User.objects.get(id=1)
u.username="admin01"
u.save()
User.objects.filter(username="admin01")
from django.utils import timezone
current_year=timezone.now().year
User.objects.get(join_date__year=current_year)
User.objects.get(id=2)
u.was_joined_recently()
p=Points(user=u,value=1,deriver="test")
p.save()
u.points_set.all()
p1=u.points_set.create(value=1,deriver="test")
u.points_set.create(value=2,deriver="test")
p1.value
u.points_set.all()
u.points_set.count()
p2=u.points_set.filter(value=2)
p2.delete()
参考链接:
https://docs.djangoproject.com/en/1.11/intro/tutorial02/