码迷,mamicode.com
首页 > 其他好文 > 详细

(1)CRM关系表的构建

时间:2018-07-31 19:08:11      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:als   之一   any   rom   end   记录   unique   day   官网   

from django.db import models    #导入models这个类
from django.contrib.auth.models import User   #导入在django后台中自己创建的用户
# Create your models here.

#-----------客户信息表---------#
class Customer(models.Model):    #所有的model模型都要继承models.Model这个类
    ‘‘‘客户信息表‘‘‘
    source_choices = (
        (0,转介绍),
        (1,QQ群),
        (2,官网),
        (3,百度推广),
        (4,51CTO),
        (5,知乎),
        (6,市场推广)
    )#第一个值是在数据库中存的值,第二个值是在后台界面上显示的值
    name = models.CharField(max_length=32,blank=True,null=True)
    #32个字节,最多能存32个字符,blank=True表明在admin表单中可以为空,null表明数据库可以为空,两个都默认为False
    qq = models.CharField(max_length=32,unique=True)
    #unique表明这个字段数据在数据库中必须唯一
    qq_name = models.CharField(max_length=64,blank=True,null=True)
    #客户的qq名称
    phone = models.CharField(max_length=64,blank=True,null=True)
    #客户的电话
    source = models.SmallIntegerField(choices=source_choices)
    #客户的来源,小整数。SmallIntegerField包含-32768到32767。
    referral_from = models.CharField(verbose_name="转介绍人qq",max_length=64,blank=True)
    #转介绍人信息,verbose_name="转介绍人qq"将信息可读化
    consult_course = models.ForeignKey("Course",verbose_name="咨询课程")
    #咨询的课程,多对一(ForeignKey)外键要定义在‘多’的一方,注意在django2中一定要设置on_delete这个属性值
    content = models.TextField(verbose_name="咨询详情")
    #咨询的内容,verbose_name="咨询详情"将信息可读化
    tags = models.ManyToManyField("Tag")
    #给这个人打标签,多对多关系在数据库中也是非常常见的关系类型。
    # 比如一本书可以有好几个作者,一个作者也可以写好几本书。
    # 多对多的字段可以定义在任何的一方,请尽量定义在符合人们思维习惯的一方,但不要同时都定义
    #null参数对ManyToManyField多对多字段无效!设置null=True毫无意义
    consultant = models.ForeignKey("UserProfile",verbose_name="咨询的人员")
    #咨询了那一个销售人员,外键关联用户,注意在django2中ForeignKey一定要设置on_delete这个属性值
    note = models.TextField(blank=True,null=True)
    #给这个人做一些笔记,
    date = models.DateTimeField(auto_now_add=True)
    #客户信息时间表
    # auto_now:每当对象被保存时将字段设为当前日期,常用于保存最后修改时间。
    # auto_now_add:每当对象被创建时,设为当前日期,常用于保存创建日期(注意,它是不可修改的)。
    status_choices = (
        (0,"未报名"),
        (1,"已报名"),
    )
    status = models.SmallIntegerField(choices=status_choices,default=0)
    #小整数,包含 - 32768到32767。
    def __str__(self):
        return self.name
    # 魔法方法,给对象返回名称

    class Meta:
        # verbose_name = "客户信息表"
        verbose_name_plural = "07客户信息表"
        # verbose_name:用于设置模型对象的直观、人类可读名如果不指定,会使用小写模型名作为默认值
        # verbose_name_plural如果不指定该选项,那么默认的复数名字是verbose_name加上‘s’

#-----------客户标签表---------#
class Tag(models.Model):
    name = models.CharField(unique=True,max_length=32)
    #字符型,必须要填max_length,unique=True表明标签名字必须唯一
    def __str__(self):
        return self.name
    # 魔法方法,给对象返回名称

    class Meta:
        verbose_name_plural = "09标签"

#-----------客户标跟进表---------#
class CustomerFollowUp(models.Model):
    ‘‘‘客户跟进表‘‘‘
    intention_choices = (
        (0,2周内报名),
        (1,1个月内报名),
        (2,近期无报名计划),
        (3,已在其它机构报名),
        (4,已报名),
        (5,已拉黑),
    )
    customer = models.ForeignKey("Customer")#跟进哪一个客户,外键关联
    content = models.TextField(verbose_name="跟进内容")#跟进了那些内容
    consultant = models.ForeignKey("UserProfile")#那个人跟进的,关联到用户
    date = models.DateTimeField(auto_now_add=True)#跟进的时间,创建后不修改。DateTimeField精确到年月
    intention = models.SmallIntegerField(choices=intention_choices)#报名状态

    def __str__(self):
        return "<%s : %s>" % (self.customer.qq,self.intention)

    class Meta:
        verbose_name_plural = "05课户跟进记录"

#-----------课程表---------#
class Course(models.Model):
    ‘‘‘课程表‘‘‘
    name = models.CharField(max_length=64,unique=True)#名字必须唯一
    price = models.PositiveSmallIntegerField()
    #PositiveSmallIntegerField较小的正整数字段,从0到32767。
    period = models.PositiveSmallIntegerField(verbose_name="周期(月)")
    #PositiveSmallIntegerField    较小的正整数字段,从0到32767。
    outline = models.TextField()
    #课程大纲

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "04课程表"
    #模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名、人类可读的单数或者复数名等等。
    #想在模型中增加元数据,方法很简单,在模型类中添加一个子类,名字是固定的Meta

#-----------校区表---------#
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_plural = "01校区"

#-----------班级表---------#
class ClassList(models.Model):
    ‘‘‘班级表‘‘‘
    class_type_choices = (
        (0,面授(脱产)),
        (1,面授(周末)),
        (2,网络班)
    )
    branch = models.ForeignKey("Branch",verbose_name="校区")
    course = models.ForeignKey("Course")#课程表关联到课程
    semester = models.PositiveSmallIntegerField(verbose_name="学期")#第几个学期
    teacher = models.ManyToManyField("UserProfile",blank=True)#讲师关联起来
    class_type = models.SmallIntegerField(choices=class_type_choices,verbose_name="上课类型")
    strat_date = models.DateField(verbose_name="开班日期")#不包含时分秒
    end_date = models.DateField(verbose_name="结业日期",blank=True,null=True)

    def __str__(self):
        return "%s %s %s" % (self.branch,self.course,self.semester)
        #返回到界面上显示的值

    class Meta:
        unique_together = (branch,course,semester)  #联合唯一
        #unique_together,同一个校区的课程和学期是不能相同的。
        #每一个元素都是一个元组,表示一组联合唯一约束,可以同时设置多组约束。
        # 为了方便,对于只有一组约束的情况下,可以简单地使用一维元素,例如:unique_together = (‘name‘, ‘birth_day‘, ‘address‘)
        #两个人的名字、生日和出生地不能为同一天。
        verbose_name_plural = "02班级表"

#-----------上课记录表---------#
class CourseRecord(models.Model):
    ‘‘‘上课记录‘‘‘
    from_class = models.ForeignKey("ClassList",verbose_name="班级")#来自于哪个班级,具体哪个班级
    day_num = models.PositiveSmallIntegerField(verbose_name="第几节(天)")
    #较小的正整数字段,从0到32767。
    teacher = models.ForeignKey("UserProfile")
    #关联用户,用户中有很多人,学生、老师、销售等
    has_homework = models.BooleanField(default=True)
    #布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签
    homework_title = models.CharField(max_length=128,blank=True,null=True)
    homework_content = models.TextField(blank=True,null=True)
    #大量文本内容,在HTML中表现为Textarea标签,最常用的字段类型之一!
    # 如果你为它设置一个max_length参数,那么在前端页面中会受到输入字符数量限制,然而在模型和数据库层面却不受影响。
    outline = models.TextField(verbose_name="课程大纲")
    date = models.DateField(auto_now_add=True)
    #上课的日期,不显示时分秒

    def __str__(self):
        return "%s %s" % (self.from_class,self.day_num)

    class Meta:
        unique_together = ("from_class","day_num")#联合唯一,只能有同一个课程和天数要唯一
        verbose_name_plural = "03上课记录"

#--------记录学生学习记录表------#
class StudyRecord(models.Model):
    ‘‘‘学习记录表‘‘‘
    attendance_choices = (
        (0,已签到),
        (1,迟到),
        (2,缺勤),
        (3,早退),
    )
    score_choices = (
        (100,"A+"),
        (90,"A"),
        (85,"B+"),
        (80,"B"),
        (75,"B-"),
        (70,"C+"),
        (60,"C"),
        (40,"C-"),
        (-50,"D"),
        (-100,"Copy"),
        (0,"N/A"),
    )
    student = models.ForeignKey("Enrollment")#关联到报名的人
    course_record = models.ForeignKey("CourseRecord")#关联到上课的人
    attendance = models.SmallIntegerField(choices=attendance_choices, default=0)#小整数,包含-32768到32767。
    scorce = models.SmallIntegerField(choices=score_choices,default=0)#    小整数,包含-32768到32767。
    memo = models.TextField(blank=True,null=True)#备注,上课情况如何等
    date = models.DateField(auto_now_add=True)#不包含时分秒

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

    class Meta:
        verbose_name_plural = "06学习记录"

#-----------报名表---------#
class Enrollment(models.Model):
    ‘‘‘报名表‘‘‘
    customer = models.ForeignKey("Customer")#跟踪的客户,有客户并不代表这个客户报名了
    enrolled_class = models.ForeignKey("ClassList",verbose_name="所报班级")#关联班级表
    consultant = models.ForeignKey("UserProfile",verbose_name="课程顾问")
    contract_agreed = models.BooleanField(default=False,verbose_name="学员已同意条款")
    #布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。如果要接收null值,请使用NullBooleanField。
    contract_approved = models.BooleanField(default=False,verbose_name="合同已已审核")#看合同是否已经审核
    date = models.DateField(auto_now_add=True)

    def __str__(self):
        return "%s %s"%(self.customer,self.enrolled_class)
    class Meta:
        unique_together = ("customer","enrolled_class")#客户与报名的班级必须唯一
        verbose_name_plural = "08报名表"

#-----------缴费记录表---------#
class Payment(models.Model):
    ‘‘‘缴费记录‘‘‘
    customer = models.ForeignKey("Customer")
    course = models.ForeignKey("Course",verbose_name="所报课程")#所报课程要关联起来
    amount = models.PositiveIntegerField(verbose_name="数额",default=500)#正整数字段,包含0,最大2147483647。
    consulant = models.ForeignKey("UserProfile")#必须关联到用户,咨询的人必须关联用户表
    date = models.DateTimeField(auto_now_add=True)#显示时分秒

    def __str__(self):
        return "%s %s"%(self.customer,self.amount)#客户的名字和数额,

    class Meta:
        verbose_name_plural = "10缴费记录"

#------------账号表--------#
class UserProfile(models.Model):
    ‘‘‘账号表‘‘‘
    user = models.OneToOneField(User)#用户有哪些人
    #将用户外键关联到User
    #这种关系类型多数用于当一个模型需要从别的模型扩展而来的情况。
    # 比如,Django自带auth模块的User用户表,如果你想在自己的项目里创建用户模型,又想方便的使
    #用Django的认证功能,那么一个比较好的方案就是在你的用户模型里,
    # 使用一对一关系,添加一个与auth模块User模型的关联字段。
    name = models.CharField(max_length=32)#它的名字叫做什么
    roles = models.ManyToManyField("Role",blank=True)#它的角色是什么,什么样的角色能够看什么菜单

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "12账号表"

#------------角色表--------#
class Role(models.Model):
    ‘‘‘角色表‘‘‘
    #不同角色看到的菜单是不同的
    name = models.CharField(max_length=32,unique=True)
    menus = models.ManyToManyField("Menu",blank=True)
    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "11角色"

#------------菜单表--------#
class Menu(models.Model):
    ‘‘‘专门存菜单‘‘‘
    name = models.CharField(max_length=32)#名字最多为32个字符
    url_name = models.CharField(max_length=64)
    #不同权限的人看到的菜单是不同的,通过url去控制

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "13菜单"

 

(1)CRM关系表的构建

标签:als   之一   any   rom   end   记录   unique   day   官网   

原文地址:https://www.cnblogs.com/chengtianyu/p/9397090.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!