如何在父模型查询中获取子模型相关数据

时间:2015-11-26 07:36:03

标签: python django

我有两种模式:

class BusinessCard(models.Model):
      name = models.CharField(_("name"),null=True,max_length=50)


class Contacts(models.Model):
      businesscard_id = models.OneToOneField(BusinessCard,null=True,blank=True,related_name='contact_detail',db_column="businesscard_id")
      bcard_json_data = JsonField(null=True)

我只想使用名片模型访问联系人模型数据: target_bacard=BusinessCard.objects.filter(id=target_bacard_id).select_related()

当我们访问target_bacard.contact_detail时,会出现关键错误 如何使用target_bacard queryset获取联系人数据。

3 个答案:

答案 0 :(得分:1)

使用get()代替filter(),如:

target_bacard = BusinessCard.objects.get(id=target_bacard_id)
target_bacard.contact_detail

答案 1 :(得分:1)

如果要访问与BusinessCard实例 bacard 呈1对1关系的Contacts实例,请使用您在 Contacts 中指定的相关名称:

contact = bacard.contact_detail

此外,您有一些误导性的名称:通讯录应该是联系人,因为此模型的实例仅代表一个联系人。其字段 businesscard_id 最好命名为 businesscard (请注意,在该情况下,表格列将自动在数据库级别称为 businesscard_id 相关businesssscard的id)因为在ORM中,当您访问它时,您会得到一个BusinessCard模型实例,而不仅仅是它的 id

答案 2 :(得分:0)

您尚未将相关模型(字段)参数传递给select_related()

target_bacard=BusinessCard.objects.filter(id=target_bacard_id).select_related('contact_detail')

假设BusinessCard的id是唯一的,您可能希望使用...objects.get(id=target_bacard_id)取代...objects.filter(id=target_bacard_id)。无论如何,select_related()将在两种方式下工作。

select_related()用于保存数据库查询。 这是documentation