Customer模型:

class Customer(models.Model):

    name = models.CharField(max_length=32)    qq = models.CharField(max_length=64,unique=True)    weixin = models.CharField(max_length=64,blank=True,null=True)    age = models.PositiveSmallIntegerField(blank=True,null=True)    referral_from = models.ForeignKey("Customer",related_name="my_referrals",                                      blank=True,null=True,verbose_name="转介绍",on_delete=models.CASCADE)    date =  models.DateTimeField(auto_now_add=True)  #auto_now_add自动增加

    def __str__(self):        return self.name

    class Meta:        verbose_name_plural = "客户信息表"        verbose_name = "客户信息表"

----------------------------------------------------------
Enrollment模型:
class Enrollment(models.Model):    """学员报名信息"""    customer = models.ForeignKey("Customer",on_delete=models.CASCADE,related_name='entries')    class_grade = models.ForeignKey("ClassList",on_delete=models.CASCADE)    enrollment_date = models.DateField()    def __str__(self):        #return self.customer

    class Meta:        unique_together =  ("customer","class_grade")---------------------------------------------------------------------------
FollowUpRecord模型
class FollowUpRecord(models.Model):    customer = models.ForeignKey("Customer",on_delete=models.CASCADE)    content = models.TextField(max_length=1024)    def __str__(self):        return "%s" % self.customer----------------------------------------------------------------------------
ClassList模型:
class ClassList(models.Model):    semester = models.PositiveSmallIntegerField(verbose_name="学期")    class_type_choices = ((0,'脱产'),(1,'周末'),(2,'网络'))    start_date = models.DateField()    end_date = models.DateField()

-----------------------------------------------------------------------------------------------------------

使用ForeignKey查询

正向查询

关系模型Enrollment包含关联模型Customer的ForeignKey, 模型Enrollment的实例可以通过关联字段访问Customer实例:

>>> e = Enrollment.objects.get(id=2)         #注意:此处不能用e =Enrollment.objects.filter(id=2)

>>> e.customer                                          # 通过上查询到的e对象,关联字段( e.customer )访问到Customer实例

修改e.customer并调用save方法存入数据库

>>> e.customer= some_customer

>>> e.save()

如果ForeignKey 字段有null=True 设置(即它允许NULL值),可以分配None来删除对应的关联性

>>> e.customer= null

>>> e.save()


反向查询

已经得到模型Customer的实例,需要查询该以该实例为外键的相关模型(如FollowUpRecord和Enrollment),可以使用查询集API取出相应的实例。

外键没有指定related_name的相关模型:FollowUpRecord

>>> customer = models.ForeignKey("Customer",on_delete=models.CASCADE)

反查找使用 模型类名小写_set.all() ,方法如下:

>>>  c = Customer.objects.get(id=1)

>>>  c.followuprecord_set.all()


外键指定related_name的相关模型:Enrollmentcustomer = models.ForeignKey("Customer",on_delete=models.CASCADE,related_name='entries')
反查找不能使用 模型类名小写_set.all(),需要使用related_name的值,方法如下:

>>>  c = Customer.objects.get(id=1)

>>>  c.entries.all()

												

Django CRM查询(一对多,多对多以及相关的反查)的更多相关文章

  1. mybatis报错:查询一对多或多对多时只返回一条数据的问题

    问题: 使用映射文件实现查询一对多或多对多时只返回一条数据问题 解决方法: 导致这种情况出现的问题是因为两个表中的主键是一样所以出现了数据覆盖问题. 解决方式一:修改数据库表中的主键(这种方法比较麻烦 ...

  2. Django ORM 一对一,一对多,多对多, 添加,批量插入和查询

    模型类 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_ ...

  3. Django CRM查询 XXX.object.filter() 常用用法总结

    __gt 大于 __gte 大于等于 User.objects.filter(age__gt=10) // 查询年龄大于10岁的用户 User.objects.filter(age__gte=10) ...

  4. hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有

    今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午.......也是刚刚好复习到这里 顺便就写写 注意:一般都在多方维护关系,至于是用单向还是用 ...

  5. day 69-70 一对一 一对多 多对一联表查询

    day 69 orm操作之表关系,多对多,多对一 多对一/一对多, 多对多{类中的定义方法} day69 1. 昨日内容回顾 1. 单表增删改查 2. 单表查询API 返回QuerySet对象的: 1 ...

  6. Django 数据库查询集合(多对多)

    Django 数据库查询集合(双下划线连表操作) 目录: 1.Django环境搭建 2.数据库建表 3.写入数据 4.查询语句 Django环境搭建 1.安装django pip install dj ...

  7. Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)

    目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...

  8. 数据库开发-Django ORM的一对多查询

    数据库开发-Django ORM的一对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  9. django orm查询和后端缓存的使用

    django orm 查询 1 字段后(db_column='age') (null=True)#表示数据库里面的该字段数据可以为空 (blank=True)#表示前端表单提交的时候可以为空 (db_ ...

随机推荐

  1. 用js通过url传参把数据从一个页面传到另一个页面

    好长时间没写博客了,时值五一,外面到处人山人海,本宝宝还是好好呆在家学习吧.好了,言归正传.在没有后台支持的情况下,如何实现从一个页面像另一个页面来传递数据呢?应该很多人遇到过这个问题吧.那我就来说说 ...

  2. 【Python】Python中子类怎样调用父类方法

    python中类的初始化方法是__init__(),因此父类子类的初始化方法都是这个,如果子类不实现这个函数,初始化时调用父类的初始化函数,如果子类实现这个函数,就覆盖了父类的这个函数,既然继承父类, ...

  3. android中常见的命名及其特点详解

    Paseal命名法 Paseal命名法特点:String MyName-DelphiInt MyAge每个单词首字母大写 Camel命名法 Camel(驼峰的意思)命名法特点:String myNam ...

  4. BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)

    对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...

  5. Thymeleaf 如何支持java8的时间LocalDate和LocalDatetime

    一.添加依赖 <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thym ...

  6. BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】

    题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...

  7. BZOJ1095 [ZJOI2007]Hide 捉迷藏 【动态点分治 + 堆】

    题目链接 BZOJ1095 题解 传说中的动态点分治,一直不敢碰 今日一会,感觉其实并不艰涩难懂 考虑没有修改,如果不用树形dp的话,就得点分治 对于每个重心,我们会考虑其分治的子树内所有点到它的距离 ...

  8. 【BZOJ 2434】 [Noi2011]阿狸的打字机 fail树+树状数组

    就是考了一个fail树的神奇应用我们建出fail树之后,发现我们就是在求y到根的路径上所有的点在以x为根的子树里的个数,这个我们离线后用树状数组+dfs序即可解决 #include <cstdi ...

  9. 一个JavaScript日期格式化扩展函数

    我们都知道在Java和PHP语言中,有专门用于格式化日期对象的类和函数,例如Java中的DateFormat等等,通过这些类和函数,我们可以方便的将一个日期对象按照格式的要求输出为字符串,例如对于同一 ...

  10. Hbase写入量大导致region过大无法split问题

    最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题.让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region ...