如何基于父模型字段过滤对象?Django关联查询问题求助
问题:查找接诊过指定患者的治疗师
现有模型代码
Visit模型
class visit(models.Model): customer_name=models.ForeignKey(customerprofile, on_delete=models.CASCADE) therapist_name=models.ForeignKey(therapistProfiles, on_delete=models.CASCADE, default=1)
关联用户模型
class customerprofile(models.Model): c_name= models.CharField(max_length=40, null=True, blank=True) class therapistProfiles(models.Model): user=models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) name=models.CharField(max_length=30, null=True, blank=True)
遇到的问题
我在编写getthefee属性方法时,第一个查询语句可正常执行,但第二个查询始终无法匹配到结果:
@property def getthefee(self): customer = customerprofile.objects.get(c_name=self.customer_name) therapist=therapistProfiles.objects.get(name=self.therapist_name)
之后改用过滤方式,当截取字符串前10位时能正常返回结果,但截取长度改为11或更长时就返回空值:
therapist=therapistProfiles.objects.distinct().filter(name__contains=str(self.therapist_name)[0:10])
问题原因
- 初始查询失败核心:
self.therapist_name是ForeignKey关联的therapistProfiles对象实例,并非字符串类型。用name=self.therapist_name相当于拿字符串类型的name字段匹配整个对象,逻辑完全错误,自然查不到结果。 - 临时过滤方式的局限性:将
self.therapist_name转字符串时,Django默认输出格式类似<therapistProfiles: 治疗师姓名>,截取前10位可能刚好包含部分姓名内容,能模糊匹配数据库中的name字段;但截取更长时,字符串会包含<therapistProfiles:这类无关字符,与数据库name字段完全不匹配,因此返回空。
正确解决方法
1. 直接使用关联对象(针对当前Visit实例的治疗师查询)
既然therapist_name是ForeignKey,当前Visit实例的self.therapist_name本身就是对应的therapistProfiles对象,无需再去数据库查询:
@property def getthefee(self): customer = self.customer_name # 直接获取关联的患者对象 therapist = self.therapist_name # 直接获取关联的治疗师对象 # 后续业务逻辑...
2. 查询指定患者的所有接诊治疗师(全局查询场景)
如果要实现“查找接诊过指定患者的所有治疗师”的需求,直接通过反向关联查询即可:
# 先获取目标患者对象 target_customer = customerprofile.objects.get(c_name="目标患者姓名") # 查询所有接诊过该患者的治疗师 therapists = therapistProfiles.objects.filter(visit__customer_name=target_customer).distinct()
也可直接通过患者姓名匹配:
therapists = therapistProfiles.objects.filter(visit__customer_name__c_name="目标患者姓名").distinct()
内容的提问来源于stack exchange,提问作者Afshin Asadpour
相关产品推荐
相关产品推荐

