美文网首页python大法攻略
Django项目(一、APP和对应model层的设计)

Django项目(一、APP和对应model层的设计)

作者: 眼君 | 来源:发表于2020-09-09 09:01 被阅读0次

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了。

相关文章

网友评论

    本文标题:Django项目(一、APP和对应model层的设计)

    本文链接:https://www.haomeiwen.com/subject/zikjektx.html