首页 > 解决方案 > Django:在没有额外 SQL 的情况下获取外键字段的值到 DB

问题描述

模型

class Photo(models.Model):
    doc_pic = models.ImageField(upload_to='specialist/', default='', null=True, blank=True, max_length=250)
    doctor = models.ForeignKey(Doctor, blank=True, null=True, on_delete=models.SET_NULL, related_name='photos')

我查询照片

temp = Photo.objects.all()

现在我想要保存在医生字段中的医生 ID(对于第一个元素)

print(temp[0].doctor)

我收到了 Doctor 对象。但我想要数字 ID。我怎么能得到那个?

我知道我可以得到它

temp[0].doctor.id 

但这会向我想避免的数据库提交另一个查询。

标签: djangodjango-queryset

解决方案


如果添加 a ForeignKey,您实际上已经构建了两个属性:

  • fieldname那是对相关实例的引用;和
  • fieldname_id这是真正的数据库列,它存储了它所引用的表的主键。

所以你可以写:

temp[0].doctor_id

如果您只对 感兴趣doctor_id,而对其他字段不感兴趣,则可以使用以下方法提高查询效率values_list

Photo.objects.values_list('doctor_id', flat=True).first()

其实如果使用values_list,这里可以doctor直接作为字段使用,它只会返回标识符,不会返回对应的Doctor实例:

# equivalent to values_list with doctor_id
Photo.objects.values_list('doctor', flat=True).first()

推荐阅读