Django之路 - 项目实战CRM开发 老男孩Python

    /    2019-04-19

表结构设计

在设计表结构前,咱们先创建好一个项目吧,项目名就叫PerfectCRM,app名叫crm

 我这里先列出来我们大体需要的表,尔等先过目一下,然后我们再分别为什么需要每个具体的表,及这个表里要存什么样的数据

from django.db import models
# Create your models here.
class Customer(models.Model):
    '''存储所有客户信息'''
    pass
class Enrollment(models.Model):
    '''存储已报名学员的信息'''
    pass
class CustomerFollowUp(models.Model):
    '''存储客户的后续跟进信息'''
    pass
class ClassList(models.Model):
    '''存储班级信息'''
    pass
class Course(models.Model):
    '''存储所开设课程的信息'''
    pass
class CourseRecord(models.Model):
    '''存储各班级的上课记录'''
    pass
class StudyRecord(models.Model):
    '''存储所有学员的详细的学习成绩情况'''
    pass
class UserProfile(models.Model):
    '''存储所有讲师\销售人员\ 学员 用户信息'''
    pass
class Role(models.Model):
    '''角色信息'''
    pass
class Branch(models.Model):
    '''存储所有校区'''
    pass

接下来分别解释每张表

1. Customer表, 主要给销售人员用, 存储所有客户信息,里面要记录客户来源\姓名\qq \客户来源\咨询的内容等

class Customer(models.Model):
    '''存储所有客户信息'''
    #客户在咨询时,多是通过qq,所以这里就把qq号做为唯一标记客户的值,不能重复
    qq = models.CharField(max_length=64,unique=True,help_text=u'QQ号必须唯一')
    qq_name = models.CharField(u'QQ名称',max_length=64,blank=True,null=True)
    #客户只要没报名,你没理由要求人家必须告诉你真实姓名及其它更多私人信息呀
    name = models.CharField(u'姓名',max_length=32,blank=True,null=True)
    sex_type = (('male',u'男'),('female',u'女'))
    sex = models.CharField(u"性别",choices=sex_type,default='male',max_length=32)
    birthday = models.DateField(u'出生日期',max_length=64,blank=True,null=True,help_text="格式yyyy-mm-dd")
    phone = models.BigIntegerField(u'手机号',blank=True,null=True)
    email = models.EmailField(u'常用邮箱',blank=True,null=True)
    id_num = models.CharField(u'身份证号',blank=True,null=True,max_length=64)
    source_type = (('qq',u"qq群"),
                   ('referral',u"内部转介绍"),
                   ('website',u"官方网站"),
                   ('baidu_ads',u"百度广告"),
                   ('qq_class',u"腾讯课堂"),
                   ('school_propaganda',u"高校宣讲"),
                   ('51cto',u"51cto"),
                   ('others',u"其它"),
                   )
    #这个客户来源渠道是为了以后统计各渠道的客户量\成单量,先分类出来
    source = models.CharField(u'客户来源',max_length=64, choices=source_type,default='qq')
    #我们的很多新客户都是老学员转介绍来了,如果是转介绍的,就在这里纪录是谁介绍的他,前提这个介绍人必须是我们的老学员噢,要不然系统里找不到
    referral_from = models.ForeignKey('self',verbose_name=u"转介绍自学员",help_text=u"若此客户是转介绍自内部学员,请在此处选择内部\学员姓名",blank=True,null=True,related_name="internal_referral")
    #已开设的课程单独搞了张表,客户想咨询哪个课程,直接在这里关联就可以
    course = models.ForeignKey("Course",verbose_name=u"咨询课程")
    class_type_choices = (('online'u'网络班'),
                          ('offline_weekend'u'面授班(周末)',),
                          ('offline_fulltime'u'面授班(脱产)',),
                          )
    class_type = models.CharField(u"班级类型",max_length=64,choices=class_type_choices)
    customer_note = models.TextField(u"客户咨询内容详情",help_text=u"客户咨询的大概情况,客户个人信息备注等...")
    work_status_choices = (('employed','在职'),('unemployed','无业'))
    work_status = models.CharField(u"职业状态",choices=work_status_choices,max_length=32,default='employed')
    company = models.CharField(u"目前就职公司",max_length=64,blank=True,null=True)
    salary = models.CharField(u"当前薪资",max_length=64,blank=True,null=True)
    status_choices = (('signed',u"已报名"),('unregistered',u"未报名"))
    status = models.CharField(u"状态",choices=status_choices,max_length=64,default=u"unregistered",help_text=u"选择客户此时的状态")
    #课程顾问很得要噢,每个招生老师录入自己的客户
    consultant = models.ForeignKey("UserProfile",verbose_name=u"课程顾问")
    date = models.DateField(u"咨询日期",auto_now_add=True)
    def __str__(self):
        return u"QQ:%s -- Name:%s" %(self.qq,self.name)
    class Meta: #这个是用来在admin页面上展示的,因为默认显示的是表名,加上这个就变成中文啦
        verbose_name = u'客户信息表'
        verbose_name_plural = u"客户信息表"
Customer

2. 学员报名表,这里为什么要把客户信息表 和 这个学员报名表分开呢? 因内一个学员可以报多个课程 ,每个课程 都需要单独记录学习成绩呀什么的,所以每报一个课程 ,就在这里生成 一条相应的报名记录

class Enrollment(models.Model):
    '''存储学员报名的信息'''
    #所有报名的学生 肯定是来源于客户信息表的,先咨询,后报名嘛
    customer = models.ForeignKey(Customer)
    school = models.ForeignKey('Branch', verbose_name='校区')
    #选择他报的班级,班级是关联课程的,比如python开发10期
    course_grade = models.ForeignKey("ClassList", verbose_name="所报班级")
    why_us = models.TextField("为什么报名老男孩", max_length=1024, default=None, blank=True, null=True)
    your_expectation = models.TextField("学完想达到的具体期望", max_length=1024, blank=True, null=True)
    contract_agreed = models.BooleanField("我已认真阅读完培训协议并同意全部协议内容")
    contract_approved = models.BooleanField("审批通过", help_text=u"在审阅完学员的资料无误后勾选此项,合同即生效")
    enrolled_date = models.DateTimeField(auto_now_add=True, auto_created=True,
                                         verbose_name="报名日期")
    memo = models.TextField('备注', blank=True, null=True)
    def __str__(self):
        return "<%s  课程:%s>" %(self.customer ,self.course_grade)
    class Meta:
        verbose_name = '学员报名表'
        verbose_name_plural = "学员报名表"
        unique_together = ("customer""course_grade")
        #这里为什么要做个unique_together联合唯一?因为老男孩有很多个课程, 学生学完了一个觉得好的话,以后还可以再报其它班级,
        #每报一个班级,就得单独创建一条报名记录,所以这里想避免重复数据的话,就得搞个"客户 + 班级"的联合唯一喽

Enrollment

(14)

分享至