Django:获取外键字段的值而无需额外的SQL到DB

时间:2018-05-28 12:02:33

标签: django django-queryset

模型

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 

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

1 个答案:

答案 0 :(得分:3)

如果添加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()