首页 > 解决方案 > 如何使用也具有外键字段的外键字段进行更新

问题描述

我有以下三个示例模型:

Class User(Model):
    ...some other fields
    receiving_info = OnetoOneField('ReceivingInfo')

Class ReceivingInfo(Model):
    ...other fields
    receiving_address = OnetoOneField('Address')
    
Class Address(Model):
    street = CharField(max_length=100)
    house_number = CharField(max_length=100)
    city = CharField(max_length=200)

我正在尝试使用以下方法更新它们:

address = Address(
   street='new st',
   house_number='new number',
   city='new city'
)

user = User.objects.get(id=id)
user.receiving_info.receiving_address = address
user.save()

但不知何故它不起作用,任何想法如何使它起作用?

标签: python-3.xdjango

解决方案


您需要先保存地址,否则它没有主键,因此您无法链接到它:

address = Address(
   street='new st',
   house_number='new number',
   city='new city'
)
address.save()

user = User.objects.get(id=id)
receiving_info = user.receiving_info
receiving_info.receiving_address = address
receiving_info.save()

您还应该保存receiving_info对象,而不是user,因为该对象保持不变。

但是,您可以提高效率,并通过ReceivingInfo直接检索一个来减少查询的数量:

address = Address.objects.create(
   street='new st',
   house_number='new number',
   city='new city'
)

receiving_info = ReceivingInfo.objects.get(user__id=id)
receiving_info.receiving_address = address
receiving_info.save()

我也不完全确定你为什么首先要有一个ReceivingInfo模型。看起来它没有太多的“附加值”,而且只会让查询变得更加复杂。如果它因此只对一些信息进行分组,则将其保存在User模型下可能会更好。


推荐阅读