前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django ORM模型设计-客户关系管理

Django ORM模型设计-客户关系管理

作者头像
小团子
发布2019-11-08 13:57:20
7480
发布2019-11-08 13:57:20
举报
文章被收录于专栏:数据云团数据云团

Django ORM模型设计-活动报名

Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL 的设计与配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用。

CRM客户关系管理系统将企业管理和客户关系管理集成到统一的平台,其系统功能主要体现在企业与客户之间的业务和企业内部部门之间的业务。

model 认证方式继承于 django 自带认证

代码语言:javascript
复制
from django.contrib.auth.models import User
代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import User

CRM 项目表结构设计

代码语言:javascript
复制
class Role(models.Model):
    '''角色表'''
    name = models.CharField(max_length=64,unique=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "角色表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class UserProfile(models.Model):
    '''用户信息表'''
    # 关联django自带的User,可以自己扩展字段
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(verbose_name='姓名',max_length=64)
    # 一个用户可以有多个角色,一个角色可以对应多个用户
    role = models.ManyToManyField(Role,blank=True,null=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "用户信息表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class CustomerInfo(models.Model):
    '''客户信息表'''
    name = models.CharField(verbose_name='姓名',max_length=64,default=None)
    contact_type_choices = ((0,'qq'),(1,'微信'),(2,'手机'))
    contact_type = models.SmallIntegerField(choices=contact_type_choices,default=0)
    contact = models.CharField(verbose_name='联系方式',max_length=64,unique=True)
    source_choices = ((0,'qq群'),(1,'51CTO'),(2,'百度推广'),(3,'知乎'),(4,'转介绍'),(5,'其它'),)
    source = models.SmallIntegerField(verbose_name='客户来源',choices=source_choices)
    # 关联自己,如果是转介绍(介绍人已经是学员,然后介绍别人过来学习),需要填写转介绍人的信息,不是转介绍,这里就可以为空
    referral_from = models.ForeignKey('self',blank=True,null=True,verbose_name='转介绍',on_delete=models.CASCADE)
    # 可以咨询多个课程
    consult_courses = models.ManyToManyField('Course',verbose_name='咨询课程')
    consult_content = models.TextField(verbose_name='咨询内容')
    status_choices = ((0,'未报名'),(1,'已报名'),(2,'已经退学'))
    status = models.SmallIntegerField(verbose_name='客户状态',choices=status_choices)
    consultant = models.ForeignKey('UserProfile',verbose_name='课程顾问',on_delete=models.CASCADE)
    date = models.DateField(verbose_name='创建的时间',auto_now_add=True)

    class Meta:
        verbose_name = "客户信息表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class Student(models.Model):
    '''学员表'''
    customer = models.ForeignKey('CustomerInfo',verbose_name='客户',on_delete=models.CASCADE)
    class_grades = models.ManyToManyField('ClassList',verbose_name='班级')

    def __str__(self):
        return self.customer

    class Meta:
        verbose_name = "学员表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class CustomerFollowUp(models.Model):
    '''客户跟踪记录表'''
    customer = models.ForeignKey('CustomerInfo',on_delete=models.CASCADE)
    content = models.TextField(verbose_name='跟踪内容')
    user = models.ForeignKey('UserProfile',verbose_name='跟进人',on_delete=models.CASCADE)
    status_choices = ((0,'近期无报名计划'),(1,'一个月内报名'),(2,'半个月报名'),(3,'已报名'),)
    status = models.SmallIntegerField(verbose_name='客户状态',choices=status_choices)
    date = models.DateField(verbose_name='创建的时间', auto_now_add=True)

    class Meta:
        verbose_name = "客户跟踪记录表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class Course(models.Model):
    '''课程表'''
    name = models.CharField(verbose_name='课程名称',max_length=64,unique=True)
    # 价格必须为整数
    price = models.PositiveSmallIntegerField(verbose_name='价格')
    period = models.PositiveSmallIntegerField(verbose_name='课程周期(月)',default=5)
    outline = models.TextField(verbose_name='大纲')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "课程表"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class Branch(models.Model):
    '''校区'''
    name = models.CharField(max_length=128,unique=True)
    addr = models.CharField(max_length=128)

    def __str__(self):
        return self.name
 
    class Meta:
        verbose_name = "校区"
        verbose_name_plural = verbose_name
代码语言:javascript
复制
class ClassList(models.Model):
    '''班级列表'''
    branch = models.ForeignKey('Branch',verbose_name='校区',on_delete=models.CASCADE)
    # 一个班级只能有一个课程,一个课程可以有多个班级
    course = models.ForeignKey('Course',verbose_name='课程',on_delete=models.CASCADE)
    class_type_choices = ((0,'脱产'),(1,'周末'),(2,'网络班'))
    class_type = models.SmallIntegerField(verbose_name='班级类型',choices=class_type_choices,default=0)
    semester = models.SmallIntegerField(verbose_name='学期')
    teachers = models.ManyToManyField('UserProfile',verbose_name='讲师')
    start_date = models.DateField(verbose_name='开班日期')
    # 毕业日期因为不固定,所以可以为空
    graduate_date = models.DateField('毕业日期',blank=True,null=True)

    def __str__(self):
        # 班级名是课程名+第几期拼接起来的
        return "%s(%s)期"%(self.course.name,self.semester)

    class Meta:
        verbose_name = "班级列表"
        verbose_name_plural = verbose_name
        # 联合唯一,班级不能重复
        unique_together = ('branch','class_type','course','semester')
代码语言:javascript
复制
class CourseRecord(models.Model):
    '''上课记录'''
    class_grade = models.ForeignKey('ClassList',verbose_name='上课班级',on_delete=models.CASCADE)
    day_num = models.PositiveSmallIntegerField(verbose_name='课程节次',)
    teacher = models.ForeignKey('UserProfile',verbose_name='讲师',on_delete=models.CASCADE)
    title = models.CharField(verbose_name='本节主题',max_length=64)
    content = models.TextField(verbose_name='本节内容')
    has_homework = models.BooleanField(verbose_name='本节有作业',default=True)
    homework = models.TextField(verbose_name='作业需求',blank=True,null=True)
    date = models.DateField(verbose_name='创建的时间', auto_now_add=True)

    def __str__(self):
        # 上课班级+课程节次
        return "%s第(%s)节"%(self.class_grade,self.day_num)

    class Meta:
        verbose_name = "上课记录"
        verbose_name_plural = verbose_name
        unique_together = ('class_grade','day_num')
代码语言:javascript
复制
class StudyRecord(models.Model):
    '''学习记录表'''
    # 一节课对应多个学生
    course_record = models.ForeignKey('CourseRecord',verbose_name='课程')
    # 一个学生有多个上课记录
    student = models.ForeignKey('Student',verbose_name='学生',on_delete=models.CASCADE)
    score_choices = ((100,'A+'),
                     (90,'A'),
                     (85,'B+'),
                     (80,'B'),
                     (75,'B-'),
                     (70,'C+'),
                     (60,'C'),
                     (40,'C-'),
                     (-50,'D'),
                     (0,'N/A'),         #not avaliable
                     (-100,'COPY'),     #抄作业
                     )
    score = models.SmallIntegerField(verbose_name='得分',choices=score_choices,default= 0)
    show_choices = ((0,'缺勤'),
                    (1,'已签到'),
                    (2,'迟到'),
                    (3,'早退'),
                    )
    show_status = models.SmallIntegerField(verbose_name='出勤',choices=show_choices,default=1)
    note = models.TextField(verbose_name='成绩备注',blank=True,null=True)
    date = models.DateField(verbose_name='创建的时间', auto_now_add=True)

    def __str__(self):
        return "%s %s %s"%(self.course_record,self.student,self.score)

    class Meta:
        verbose_name = "学习记录表"
        verbose_name_plural = "学习记录表"
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档