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. 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结

    2019/01/13 今天测试发现结果不符合预期呀,发现设置了arp_filter之后,仍然是能ping通主机上的另外一张网卡.但是现在的问题是 -------------------- 内核中是如何 ...

  2. 解决Git无法同步空文件夹的问题

    思路:在每个空文件夹下创建空文件,同步后再删除 package org.zln.module1.demo1; import org.apache.log4j.Logger; import java.i ...

  3. Mac系统中常用快捷键

    刚刚接触IOS系统,收集了一些快捷键和系统指令,以便能更好的学习IOS开发. 一.文件操作    复制:Command + C      粘贴:Command + V    回退:Command + ...

  4. BZOJ4602 SDOI2016齿轮(搜索)

    dfs一遍给每个齿轮随便标个值看是否矛盾就行了. #include<iostream> #include<cstdio> #include<cmath> #incl ...

  5. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)

    注意到模数很小,容易想到使用卢卡斯定理,即变成一个2333进制数各位组合数的乘积.对于k的限制容易想到数位dp.可以预处理一发2333以内的组合数及组合数前缀和,然后设f[i][0/1]为前i位是否卡 ...

  6. [洛谷P3690]【模板】Link Cut Tree (动态树)

    题目大意:给定$n$个点以及每个点的权值,要你处理接下来的$m$个操作.操作有$4$种.操作从$0到3编号.点从1到n编号. $0,x,y$:代表询问从$x$到$y$的路径上的点的权值的$xor$和. ...

  7. [poj 3261]后缀数组+滑窗最小值

    题目链接:http://poj.org/problem?id=3261 这个是可以交叉的重复串,所以用height就可以了,但是题目说让重复k次以上,也就是直接做一个k-1长度的滑窗最小值,从这些最小 ...

  8. 最小k度最小生成树模板

    代码是抄的 题解是瞄的 可我想学习的心是真的嘤嘤嘤 然而 还是上传一份ioi大神的论文吧 链接:https://pan.baidu.com/s/1neIW9QeZEa0hXsUqJTjmeQ 密码:b ...

  9. The 'brew link' step did not complete successfully

    在mac 上更新node时遇到了一系列的问题: 卸载node重新安装之后提示: The 'brew link' step did not complete successfully 其实这里已经给出了 ...

  10. javaScript获取文档中所有元素节点的个数

    HTML+JS 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...