1、四个model完整代码:

# users/models.py

from datetime import datetime

from django.db import models
from django.contrib.auth.models import AbstractUser class UserProfile(AbstractUser): gender_choices = (
('male', '男'),
('female', '女')
) nick_name = models.CharField('昵称', max_length=50, default='')
birthday = models.DateField('生日', null=True, blank=True)
gender = models.CharField('性别', max_length=10, choices=gender_choices, default='female')
adress = models.CharField('地址', max_length=100, default='')
mobile = models.CharField('手机号', max_length=11, null=True, blank=True)
image = models.ImageField(upload_to='image/%Y%m', default='image/default.png', max_length=100) class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name def __str__(self):
return self.username class EmailVerifyRecord(models.Model):
send_choices = (
('register', '注册'),
('forget', '找回密码')
) code = models.CharField('验证码', max_length=20)
email = models.EmailField('邮箱', max_length=50)
send_type = models.CharField(choices=send_choices, max_length=10)
send_time = models.DateTimeField(default=datetime.now) class Meta:
verbose_name = '邮箱验证码'
verbose_name_plural = verbose_name class Banner(models.Model):
title = models.CharField('标题', max_length=100)
image = models.ImageField('轮播图', upload_to='banner/%Y%m', max_length=100)
url = models.URLField('访问地址', max_length=200)
index = models.IntegerField('顺序', default=100)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '轮播图'
verbose_name_plural = verbose_name

  

# course\models.py

from django.db import models
from datetime import datetime
# Create your models here. 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="课程详情") # 暂时为TextField
degree = models.CharField(choices=(("cj", "初级"), ("zj", "中级"), ("gj", "高级")), max_length=2)
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(upload_to="course/%Y/%m", verbose_name="封面图", max_length=100)
click_num = 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 __str__(self):
return self.name class Lesson(models.Model):
course = models.ForeignKey(Course, verbose_name="课程", on_delete=models.CASCADE) # 删除关联数据,与之关联也删除
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 def __str__(self):
return '《{0}》课程的章节 >> {1}'.format(self.course, self.name) class Video(models.Model):
lesson = models.ForeignKey(Lesson, verbose_name="章节", on_delete=models.CASCADE)
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="课程", on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name="视频名称")
download = models.FileField(upload_to="course/resource/%Y/%m", verbose_name="资源文件", max_length=100)
add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间") class Meta:
verbose_name = "课程信息"
verbose_name_plural = verbose_name

  

# organization\models.py
from datetime import datetime from django.db import models class CityDict(models.Model):
name = models.CharField('城市', max_length=20)
desc = models.CharField('描述', max_length=200)
add_time = models.DateTimeField(default=datetime.now) class Meta:
verbose_name = '城市'
verbose_name_plural = verbose_name class CourseOrg(models.Model):
name = models.CharField('机构名称', max_length=50)
desc = models.TextField('机构描述')
click_nums = models.IntegerField('点击数', default=0)
fav_nums = models.IntegerField('收藏数', default=0)
image = models.ImageField('封面图', upload_to='org/%Y%m', max_length=100)
address = models.CharField('机构地址', max_length=150)
city = models.ForeignKey(CityDict, verbose_name='所在城市', on_delete=models.CASCADE)
add_time = models.DateTimeField(default=datetime.now) class Meta:
verbose_name = '课程机构'
verbose_name_plural = verbose_name class Teacher(models.Model):
org = models.ForeignKey(CourseOrg, verbose_name='所属机构', on_delete=models.CASCADE)
name = models.CharField('教师名', max_length=50)
work_years = models.IntegerField('工作年限', default=0)
work_company = models.CharField('就职公司', max_length=50)
work_position = models.CharField('公司职位', max_length=50)
points = models.CharField('教学特点', max_length=50)
click_nums = models.IntegerField('点击数', default=0)
fav_nums = models.IntegerField('收藏数', default=0)
add_time = models.DateTimeField(default=datetime.now) class Meta:
verbose_name = '教师'
verbose_name_plural = verbose_name def __str__(self):
return "[{0}]的教师: {1}".format(self.org, self.name)

  

# operation\models.py

from datetime import datetime

from django.db import models

from course.models import Course
from users.models import UserProfile class UserAsk(models.Model):
name = models.CharField('姓名', max_length=20)
mobile = models.CharField('手机', max_length=11)
course_name = models.CharField('课程名', max_length=50)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '用户咨询'
verbose_name_plural = verbose_name def __str__(self):
return self.name class CourseComments(models.Model):
user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
comments = models.CharField('评论', max_length=200)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '课程评论'
verbose_name_plural = verbose_name class UserFavorite(models.Model):
FAV_TYPE = (
(1, '课程'),
(2, '课程机构'),
(3, '讲师')
) user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
fav_id = models.IntegerField('数据id', default=0)
fav_type = models.IntegerField(verbose_name='收藏类型', choices=FAV_TYPE, default=1)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '用户收藏'
verbose_name_plural = verbose_name class UserMessage(models.Model):
user = models.IntegerField('接受用户', default=0)
message = models.CharField('消息内容', max_length=500)
has_read = models.BooleanField('是否已读', default=False)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '用户消息'
verbose_name_plural = verbose_name class UserCourse(models.Model):
user = models.ForeignKey(UserProfile, verbose_name='用户', on_delete=models.CASCADE)
course = models.ForeignKey(Course, verbose_name='课程', on_delete=models.CASCADE)
add_time = models.DateTimeField('添加时间', default=datetime.now) class Meta:
verbose_name = '用户课程'
verbose_name_plural = verbose_name

 

2、创建完后记得把App添加到settings的“INSTALLED_APPS”里面

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'course',
'organization',
'operation',
]

  

3、迁移到数据库

makemigrations
migrate

  

4、将四个App放到一起

  • 新建package:apps
  • 把四个App都拖进去



    红框内的 √ 记得去掉
  • 然后Mark为sourceRoot

 

5、然而我们发现,在cmd下运行的话还是会报错



  

需要在settings设置:

import os
import sys # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

再运行就可以了



  

未完待续~~~

慕学在线网0.3_四个model的更多相关文章

  1. 慕学在线网0.5_xadmin的全局配置

    全局配置包括了以下修改: 开启主题功能: 修改左上角的"django Xadmin"和主界面的"我的公司": App菜单收叠: App名字修改(汉化). 1.把 ...

  2. 慕学在线网0.4_xadmin后台管理

    admin是基于Django开发的后台管理框架,方便,快捷,而且简单: 而xadmin就相当于admin的升级版,更加强大. 1.安装xadmin(源码安装方式) 教程 PS: - 卸载pip安装的x ...

  3. 慕学在线网0.2_users表设计(2)

    接着上一篇,我们继续对users表进行完善.其中包括邮箱验证码(EmailVerifyRecord)和轮播图(PageBanner)两个model. 1.编写"models.py" ...

  4. 慕学在线网0.2_users表设计(1)

    1.Django App设计: users-用户管理(任何web中,users表都是第一个被设计的) course-课程管理 organization-机构和教师管理 operation-用户操作管理 ...

  5. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...

  6. 【高德地图API】从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索

    原文:[高德地图API]从零开始学高德JS API(四)搜索服务——POI搜索|自动完成|输入提示|行政区域|交叉路口|自有数据检索 摘要:地图服务,大家能想到哪些?POI搜素,输入提示,地址解析,公 ...

  7. 悟透Javascript undefined,null,"",0这四个值转换为逻辑值时就是false &this关键字

    话题一:undefined,null,"",0这四个值转换为逻辑值时就是false 也就是在if判断时会把上面的五个作为false来判断.但是它们的类型确是不尽相同的,如下所示. ...

  8. DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版原创发布

    关于 DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  9. 一文上手Tensorflow2.0(四)

    系列文章目录: Tensorflow2.0 介绍 Tensorflow 常见基本概念 从1.x 到2.0 的变化 Tensorflow2.0 的架构 Tensorflow2.0 的安装(CPU和GPU ...

随机推荐

  1. Network - 互联网协议简介

    珠玉在前,不在赘言 互联网协议入门(一) 互联网协议入门(二) 通信协议:HTTP.TCP.UDP 互联网协议入门 互联网协议入门深入 当你输入一个网址,实际会发生什么? Wireshark基本介绍和 ...

  2. javascript中的LHS和RHS

    最近在拜读<你不知道的javascript>,接触到一个比较陌生的概念,LHS查询和RHS查询. 简单的一句话来讲,当变量出现在赋值操作符的左侧时进行LHS查询,出现在右侧时进行RHS查询 ...

  3. 【Object类、常用API】

    Object类 1.1 概述 java.lang.Object类是Java语言中的根类,即所有类的父类.它中描述的所有方法子类都可以使用.在对象实例化的时候,最终找的父类就是Object. 如果一个类 ...

  4. 橙色优学:2019年设计行业怎么样?UI设计行业前景分析

    互联网的飞速发展带动了UI行业的火爆,成为时下最热门的高新技术行业.UI设计区别于传统的平面设计,更加注重界面.交互.体验等方面,这使UI设计变为了高薪的行业,对设计师的技能要求也就变得更加严格. 自 ...

  5. [源码]K8 Cscan模块 C#获取内网主机IP/机器名/Banner/网页标题源码

    [原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...

  6. [EXP]Apache Superset < 0.23 - Remote Code Execution

    # Exploit Title: Apache Superset < 0.23 - Remote Code Execution # Date: 2018-05-17 # Exploit Auth ...

  7. [Node.js与数据库]node-mysql 模块介绍

    [Node.js与数据库]node-mysql 模块介绍   转载至:https://itbilu.com/nodejs/npm/NyPG8LhlW.html#multiple-statement-q ...

  8. 剑指offer【01】- 二维数组中的查找(Java)

    在经历了春招各大公司的笔试题和面试官的血虐之后,决定要刷一些算法题了,不然连面试机会都没有. 而应对笔试和面试,比较出名的就是剑指offer的题目和LeetCode的题目了.剑指offer应对面试中的 ...

  9. eval() 和 with()

    作用域完全由写代码时的函数声明所决定,js有两种机制可以实现”破坏“我们对作用域的常规理解,通过eval()和with(). 1. eval()函数接受字符串为参数,并将其中的声明提升到eval()函 ...

  10. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...