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

Posted yoyo008

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django CRM查询(一对多,多对多以及相关的反查)相关的知识,希望对你有一定的参考价值。

 

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                        # 通过关联字段访问Customer实例

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

>>>e.customer= some_customer
>>> e.save()

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

>>> e.customer= None
>>> 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的相关模型:Enrollment
customer = 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查询(一对多,多对多以及相关的反查)的主要内容,如果未能解决你的问题,请参考以下文章

django模型系统--多对多,一对一以及跨表查询

django 一对多跨表查询多对多

django数据库操作-增删改查-多对多关系以及一对多(外键)关系

转: django数据库操作-增删改查-多对多关系以及一对多(外键)关系

Django——model基础

gorm 关系一对一,一对多,多对多查询