Django03-model

本文介绍如何在Django中创建积分系统模型,包括User和Points两个模型的定义及操作,如模型字段的添加、查询及更新等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以一个积分系统作为示例

创建模型

首先在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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值