models的设计, 必须要避免循环引用, 所以需要分层设计, 层层引用。
Users APP
建立项目后, 我们需要给项目添加一个user的APP, 用于处理user的事务:
startapp users
注意在settings.py中配置新增的APP, 并重载一下USER的MODEL:
#users/settings.py
...
INSTALLED_APPS = [
...
"users"
]
...
AUTH_USER_MODEL = "users.UserProfile"
设计User Model
接下来, 我们需要设计user这个应用的models。
首先, 要注意Django有给我们设计过一个默认的user的Model, 其数据表结构我们可以在后台数据库中的auth_user表看到。Django给了我们一个AbstractUser的抽象类, 让我们可以在已有的user字段基础上新建:
#users/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name='昵称',default="")
birday = models.DateField(verbose_name='生日',null=True,blank=True)
gender = models.CharField(max_length=10,choices=(("male","男"),("female","女")),default="female")
address = models.CharField(max_length=100,default="")
mobile = models.CharField(max_length=11, null=True, blank = True)
image = models.ImageField(max_length=100,upload_to="image/%Y/%m",default="image/default.png")
class Meta:
verbose_name = "用户信息"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
设计邮箱验证码 Model
#users/models.py
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
...
class EmailVerifyRecord(models.Model):
code = models.CharField(max_length=20, verbose_name='验证码')
email = models.EmailField(max_length=50, verbose_name='邮箱')
send_type = models.CharField(max_length=10,choices=(("register","注册"),("forget","找回密码")))
send_time = models.DateTimeField(default=datetime.now)
class Meta:
verbose_name = "邮箱验证码"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
设计轮播图 Model
#users/models.py
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser
...
class Banner(models.Model):
title = models.CharField(max_length=100, verbose_name='标题')
image = models.ImageField(max_length=100,upload_to="image/%Y/%m",default="image/default.png",verbose_name='轮播图')
url = models.URLField(max_length=200, verbose_name='访问地址')
index = models.IntegerField(default=100, verbose_name='顺序')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "轮播图"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
courses APP
接下来我们需要给项目添加一个courses的APP, 用于处理courses的事务:
startapp courses
注意在settings.py中配置新增的APP:
#users/settings.py
...
INSTALLED_APPS = [
...
"courses"
]
课程信息course Model设计
#courses/models.py
from datetime import datetime
from django.db import models
class Course(models.Model):
name = models.CharField(max_length=50, verbose_name='课程名称')
desc = models.CharField(max_length=300, verbose_name='课程描述')
detail = models.TextField(verbose_name='课程详情')
degree = models.CharField(choices =(("cj","初级"),("zj","中级"),("gj","高级")), max_length=2, verbose_name='课程难度')
learn_times = models.IntegerField(default=0, verbose_name='学习时长(分钟数)')
students = models.IntegerField(default=0, verbose_name='学习人数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
image = models.ImageField(max_length=100,upload_to="courses/%Y/%m",default="image/default.png",verbose_name='封面图')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "课程信息"
verbose_name_plural = verbose_name
def __unicode__(self):
return self.username
class Lesson(models.Model):
course = models.ForeignKey(Course, verbose_name='所属课程')
name = models.CharField(max_length=100, verbose_name='章节名称')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "章节"
verbose_name_plural = verbose_name
class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name='所属章节')
name = models.CharField(max_length=100, verbose_name='视频名称')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "视频"
verbose_name_plural = verbose_name
class CourseResource(models.Model):
course = models.ForeignKey(Course, verbose_name='所属课程')
name = models.CharField(max_length=100, verbose_name='资源名称')
download = models.FileField(max_length=100,upload_to="courses/resource/%Y/%m",verbose_name='下载路径')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "课程资源"
verbose_name_plural = verbose_name
Organization APP
接下来我们需要给项目添加一个organizations的APP, 用于处理organizations的事务:
startapp organizations
注意在settings.py中配置新增的APP:
#users/settings.py
...
INSTALLED_APPS = [
...
"organizations"
]
课程信息organizations Model设计
#courses/models.py
from datetime import datetime
from django.db import models
class CityDict(models.Model):
name = models.CharField(max_length=20, verbose_name='城市名称')
desc = models.CharField(max_length=200, verbose_name='城市描述')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "城市"
verbose_name_plural = verbose_name
class CourseOrg(models.Model):
name = models.CharField(max_length=50, verbose_name='机构名称')
desc = models.CharField(max_length=300, verbose_name='机构描述')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
image = models.ImageField(max_length=100,upload_to="org/%Y/%m",default="org/default.png",verbose_name='封面图')
address = models.CharField(max_length=150,verbose_name='机构地址')
course = models.ForeignKey(CityDict, verbose_name='所在城市')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "机构"
verbose_name_plural = verbose_name
class Teacher(models.Model):
org = models.ForeignKey(CourseOrg,verbose_name='所属机构')
name = models.CharField(max_length=50, verbose_name='教师名称')
work_years = models.IntegerField(default=0, verbose_name='工作年限')
work_company = models.CharField(max_length=50, verbose_name='就职公司')
work_position = models.CharField(max_length=50, verbose_name='公司职位')
points = models.CharField(max_length=50, verbose_name='教学特点')
click_nums = models.IntegerField(default=0, verbose_name='点击数')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人数')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "教师"
verbose_name_plural = verbose_name
Operation APP
接下来我们需要给项目添加一个operation的APP, 用于处理用户的操作记录:
startapp operation
注意在settings.py中配置新增的APP:
#users/settings.py
...
INSTALLED_APPS = [
...
"operation"
]
用户操作信息operation Model设计
#operation/models.py
from datetime import datetime
from django.db import models
from users.models import UserProfile
from courses.models import Course,Teacher
class UserAsk(models.Model):
name = models.CharField(max_length=50, verbose_name='姓名')
mobile = models.CharField(max_length=11, verbose_name='手机')
course_name = models.CharField(max_length=50, verbose_name='课程名称')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户咨询"
verbose_name_plural = verbose_name
class CourseComments(models.Model):
user = models.ForeignKey(UserProfile,verbose_name='所属用户')
course = models.ForeignKey(Course,verbose_name='课程')
comments = models.CharField(max_length=200, verbose_name='评论')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户评论"
verbose_name_plural = verbose_name
class UserFavorite(models.Model):
user = models.ForeignKey(UserProfile,verbose_name='所属用户')
fav_id = models.IntegerField(default=0, verbose_name='数据ID')
fav_type = models.IntegerField(choices=((1,"课程"),(2,"课程机构"),(3,"讲师")),default=1,verbose_name='收藏类型')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户收藏"
verbose_name_plural = verbose_name
class UserMessage(models.Model):
user = models.IntegerField(default=0, verbose_name='用户ID')
message = models.CharField(max_length=500, verbose_name='消息内容')
has_read = models.BooleanField(default=False, verbose_name='是否已读')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户消息"
verbose_name_plural = verbose_name
class UserCourse(models.Model):
user = models.ForeignKey(UserProfile,verbose_name='所属用户')
course = models.ForeignKey(Course,verbose_name='课程')
add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')
class Meta:
verbose_name = "用户课程"
verbose_name_plural = verbose_name
接下来, 我们执行makemigrations和migrate就可以更新数据。
apps目录的建立
目前我们有多个app, 我们把这些app放到一个专用的目录apps中。变更了这些app的路径后, 需要在settings配置一下:
#settings.py
...
import sys
sys.path.insert(0, os.path.join(BASE_DIR,'apps'))
...
这样就等于把apps这个目录放入了resource root了。
网友评论