Django03-model

来源:互联网 发布:手机淘宝开店怎么激活 编辑:程序博客网 时间:2024/06/03 11:13

以一个积分系统作为示例

创建模型

首先在app中修改models.py定义两个模型User和Points

from django.db import modelsclass 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,Pointsu=User(username="admin",password="admin",role="admin")u.save()print(u.id)u.username="admin01"u.save()# 所有的userUser.objects.all()
为了能够直观地看到模型的内容和进行更多的修改,我们对模型做一些修改,字段的修改需要再运行migrate,在指定之前记录的join_date是使用timezone.now()

import datetimefrom django.db import modelsfrom django.utils import timezoneclass 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 shellimport djangofrom PointsPlus.models import User,PointsUser.objects.all()u=User.objects.get(id=1)u.username="admin01"u.save()User.objects.filter(username="admin01")from django.utils import timezonecurrent_year=timezone.now().yearUser.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.valueu.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/


原创粉丝点击