Django:获取外键字段的值而不需要额外的SQL查询数据库

6

模型

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个回答

10
如果你添加一个 ForeignKey,实际上你构造了两个属性:
  • fieldname 是指向相关实例的引用;
  • fieldname_id 是真正的数据库列,用于存储它所引用表的主键。

因此,你可以编写:

temp[0]<b>.doctor_id</b>

如果您只对doctor_id感兴趣,而不关心其他字段,则可以使用values_list使查询更加高效:

Photo.objects<b>.values_list('doctor_id', flat=True).first()</b>

实际上,如果你使用 values_list,你可以直接将 doctor 作为字段使用,并且它将仅仅返回标识符,而不是相应的 Doctor 实例:

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

谢谢。_id是完美的解决方案。我需要对象,而非值。 - caliph
@caliph:那么第一种解决方案是正确的选择。我只是添加了第二部分,以防你或其他人后来只对某一列感兴趣。 - Willem Van Onsem
@caliph:在多对多字段的情况下,有一个用于多对多字段的表,因此它不会在第一次查询时被获取。如果您有一个模型AB的m2m关系,则数据库中有一个名为a_b的表,其中包含abid,该表不会被查询,除非您真正需要它。 - Willem Van Onsem
啊,为了遍历我的列表并避免在每次迭代中发送查询,我需要添加.select_related('m2m-attribute'),对吧? - caliph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接