1. 销售注册,登录系统
  - 用户表 
 2.销售添加客户信息,成为销售的私户
  - 客户表
   
 3. 销售固定时间跟进客户
  - 跟进记录表
 4. 客户报名
  - 报名记录表
  - 班级表(必须有)
  - 校区表
  - 合同表
 5. 销售审核报名,学生进行缴费。
  - 报名记录表 更改审核状态
  - 缴费记录表 销售收到钱
 6. 销售将钱交给财务,财务对缴费记录进行审核
  - 缴费记录 更改审核状态
 7. 自动修改学生状态
  - 客户表  状态改成缴费成功
  
2. 班主任
 1. 每天创建课程记录,记录每天上课的情况。
  - 用户表
  - 班级表
  - 课程记录表
 2. 再根据课程记录,生成学生的学习记录,修改考勤情况。
  - 学习记录表
  
  
3. modelform
 1. 定义
  from django import froms
  from crm import models
  class RegForm(forms.ModelForm):
  
   re_password = forms.CharField(
     label='确认密码',
     widget=forms.widgets.PasswordInput()
    )
  
   class Meta:
    model = models.UserProfile
    # fields = '__all__'   # 所有字段
    # exclude = ['']     # 排除的字典
    fields = ['username', 'password', 're_password', 'name', 'department']  # 指定需要的字段
    
    widgets = {'password':forms.widgets.PasswordInput(attrs={'class':'form-control'}}   # 插件
    labels = {'username':'用户名'}    # 显示中文名  等同models给字段加verbose_name
    error_messages = {username' : {'required':'必填'}   # 字段的错误信息
    
    
   
  form_obj.is_valid()  # 校验数据
  obj = form_obj.save()   # 创建新的数据  create方法
    
 2.内容显示
   普通字段 {{ customer.qq }}
   choices  {{ customer.get_class_type_display }}
   多对多   定义方法  返回字符串    def show_teacher(self):
          return  '|'.join([str(i) for i in self.teachers.all()])
   显示状态 定义方法  返回HTML代码段 mark_safe
      from django.utils.safestring import mark_safe
  
2. 增加客户
 2. 编辑客户
  form_obj = CustomerForm(instance=obj)
  form_obj带着原有的数据,根据数据生成input的值
  
  form_obj = CustomerForm(request.POST,instance=obj)
  将提交的数据和要修改的实例交给form对象
  form_obj.save()  对要修改的实例进行修改
 3. 公户变私户
  CBV
   self.request
  
  反射
  orm操作:
   models.Customer.objects.filter(id__in=ids).update(consultant=self.request.user)
   self.request.user.customers.add(*models.Customer.objects.filter(id__in=ids))
 4. 私户变公户
  # 注意 外键 null=True 一对多的管理对象才有remove和clear方法 
  orm操作:
   models.Customer.objects.filter(id__in=ids).update(consultant=None)
   self.request.user.customers.remove(*models.Customer.objects.filter(id__in=ids))
  
 5. 模糊查询
 
  all_customer = models.Customer.objects.filter(Q(qq__contains=query) | Q(name__contains=query),
                                                          consultant__isnull=True)
  all_customer = models.Customer.objects.filter(Q(('qq__contains',query)) | Q(('name__contains',query)),
                                                          consultant__isnull=True)
               
  def get_search_contion(self,query_list):
       
   query = self.request.GET.get('query', '')
   
   q = Q()
   q.connector = 'OR'
   for i in query_list:
    q.children.append(Q(('{}__contains'.format(i), query)))
       
           return q
  
 
 
 6. 保留搜索条件
  from django.http import QueryDict
  
  print('query',request.GET)  #  <QueryDict: {'query': ['alex']}>
  
  print(request.GET.urlencode()) query=alex
  
  
  request.GET.copy()  深拷贝
  QueryDict对象
  QueryDict对象._mutable = True   # 对字典进行修改
  
  QueryDict对象['page'] = 页码数  # 多个值
  QueryDict对象.urlencode()       # query=alex&page=1     ?query=alex&page=1 
 
 
1. 添加和编辑后跳转回源页面
  qd =QueryDict()
  qd._mutable = True
  
  qd['next'] = request.get_full_path()
  qd.urlencode()
  
  
 2. 展示客户的跟进记录、增加和编辑
  obj = models.ConsultRecord.objects.filter(id=edit_id).first() or models.ConsultRecord(consultant=request.user)
  form_obj = ConsultRecordForm(instance=obj)
 
  # 限制客户是当前销售的私户
        self.fields['customer'].widget.choices = customer_choice
        # 限制跟进人是当前的用户(销售)
        self.fields['consultant'].widget.choices = [(self.instance.consultant_id, self.instance.consultant), ]
 
 
 3. 报名记录
   # 限制当前的客户只能是传的id对应的客户
        self.fields['customer'].widget.choices = [(self.instance.customer_id, self.instance.customer), ]
        # 限制当前可报名的班级是当前客户的意向班级
        self.fields['enrolment_class'].widget.choices = [(i.id, i) for i in self.instance.customer.class_list.all()]
  
  # 在客户列表中显示不同a标签
  def enroll_link(self):
   if not self.enrollment_set.exists():
    return mark_safe('<a href="{}">添加报名表</a>'.format(reverse('add_enrollment',args=(self.id,))))
   else:
    return mark_safe('<a href="{}">添加</a> | <a href="{}">查看</a>'.format(reverse('add_enrollment',
  
 
1. 公户变私户的问题解决
  - 多个销售同时申请一个客户
   谁先申请就是谁的
  mysql数据中加行级锁
   开始事务:begin;
   加锁  for update :  select * from student where id=1 for update;
   结束事务:commit;
   
 2. 班主任的功能
  - 班级的管理
   - 班级的展示
   - 添加班级
   - 编辑班级
  - 课程的管理
   -
  - 学习记录的管理
   - 批量添加
    student_list = []
    
    for student in all_students:
    
     student_list.append(models.StudyRecord(course_record=course_obj, student=student))
    
    models.StudyRecord.objects.bulk_create(student_list)
   - 展示编辑学习记录
   
    FormSet = modelformset_factory(models.StudyRecord, StudyRecordForm, extra=0)
    queryset = models.StudyRecord.objects.filter(course_record_id=course_id)
    form_set = FormSet(queryset=queryset)
    
    {% for form in form_set %}
    
     {{ form.instance.student.name }}    form.instance ——》 学习记录
     {{ form.attendance }}          ————》对应的input
     {{ form.score }}
     {{ form.homework_note }}
   
   
    提交编辑
    {{ form_set.management_form }}
    {{ form.id }}
    {{ form.student }}
    
    form_set = FormSet(request.POST)
    if form_set.is_valid():
     form_set.save()
     

orm 小结的更多相关文章

  1. ORM小结

    最近看园子里 @李林峰的园子 关于ORM的介绍,真的很好.自己看了也有一点点小心的,记录一下. ORM即为一种数据模型和数据库中关系映射的一种方式. 学过“三层架构”,知道怎么把表 示层(UI)--& ...

  2. 关于Django ORM filter方法小结

    django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...

  3. 从零开始编写自己的C#框架(26)——小结

    一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...

  4. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  5. 用事实说话,成熟的ORM性能不是瓶颈,灵活性不是问题:EF5.0、PDF.NET5.0、Dapper原理分析与测试手记

    [本文篇幅较长,可以通过目录查看您感兴趣的内容,或者下载格式良好的PDF版本文件查看] 目录 一.ORM的"三国志"    2 1,PDF.NET诞生历程    2 2,Linq2 ...

  6. WCF Data Service 使用小结(二) —— 使用WCF Data Service 创建OData服务

    在 上一章 中,介绍了如何通过 OData 协议来访问 OData 服务提供的资源.下面来介绍如何创建一个 OData 服务.在这篇文章中,主要说明在.NET的环境下,如何使用 WCF Data Se ...

  7. IbatisNet开发使用小结

    一.   介绍 平常做企业级应用,需求变化是经常的事,而很多基础代码重复也是很让人头疼的问题.所以很多人会使用一些ORM框架来增强项目的可维护性.可扩展性.IBatis.Net就是一个比较易用的ORM ...

  8. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(28)-系统小结 我们从第一节搭建框架开始直到二十七节,权限管理已经告一段落,相信很多有跟上来的园友,已经 ...

  9. 自定义ORM框架(转转)

    ORM背景 在数据库界,主流的数据库都是关系型数据库,其采用的关系型数据结构模型,无论从数学上还是实践中都相当的成熟,得到非常广泛的应用.在关系型数据结构理 论中,所有的数据都组织成一个个相互独立的二 ...

随机推荐

  1. VC++实现解析快捷方式

    VC++实现解析快捷方式: http://blog.csdn.net/mydreamremindme/article/details/9826745 

  2. matlab reshape()、full()

    一.reshape() 对于这个函数,就是重构矩阵. (1)要求:重构前后的矩阵元素个数一致.如3*4矩阵可以重构成2*6,2*3*2等. (2)重构方法:先按列将矩阵转换为向量,然后在向量的基础之上 ...

  3. 如何释放vector变量

    std::vector<cv::Point> probp; std::vector<int> plabel; plabel.clear(); std::vector<in ...

  4. 与众不同 制作会唱歌的WinRAR - imsoft.cnblogs

    为了使用方便,我们可能会把RAR压缩包制作成自解压文件.WinRAR自带的自解压模块虽然使用很方便,但千篇一律的外观看起来实在 乏味.其实,只要通过简单改造,你就可以制作出与众不同,声色俱佳的WinR ...

  5. 20分钟打造你的Bootstrap站点

    来源:http://www.w3cplus.com/css/twitter-bootstrap-tutorial.html 特别声明:此篇文章由白牙根据Leon Revill的英文文章原名<Tw ...

  6. 20155224 2016-2017-2 《Java程序设计》第5周学习总结

    20155224 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 Java中的错误都会被打包为对象,可以尝试(try)捕捉(catch)代表错误的对象 ...

  7. 【NOI2003】银河英雄传

    迭代不一定比递归好 原题: 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星 ...

  8. 转oracle 学习 - 表空间

    Oracle 数据库的表空间和 Oracle 数据库数据文件 关于 Oracle 数据库的表空间. 很多 Oracle 初学者弄不明白表空间的概念和意义,他们只知道给数据库建表的时候需要到表空间这个东 ...

  9. zeroMQ 学习

    zeroMQ 是一个高性能的分布式设计的消息队列,网上有人进行过性能的比较,非常厉害,并且很大约40多种语言的API 可以调用,真实很不错的. 而且有一点就是使用简单,不需要服务器,对于使用C/C++ ...

  10. EF Codefirst方式数据库维护操作

    关于EF codefirst方式数据库维护操作 1.数据实体更新 2.打开pm - 锁定项目:MLearning.Data 3.执行命令 : add-migration [名称] 4.检查无误后,执行 ...