python-3.x - 如何使用也具有外键字段的外键字段进行更新
问题描述
我有以下三个示例模型:
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()
但不知何故它不起作用,任何想法如何使它起作用?
解决方案
您需要先保存地址,否则它没有主键,因此您无法链接到它:
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
模型下可能会更好。
推荐阅读
- javascript - 节点 js TCP.onStreamRead 问题
- angular - Angular,在 AppRoutingModule 加载之前加载 json 文件
- python - 有人可以分解这段代码并解释一下吗?
- angular - 使用 Web3 时浏览器中未捕获的 ReferenceError
- html - 阻止左滑动菜单使用 css 推送内容
- asp.net - Visual Studio:新安装后的智能感知问题
- html - 网格在 HTML CSS 中制作盒子?
- mongodb - MopngoDb 单节点副本集与 docker 容器
- mpandroidchart - 如何在数据中定位MPandroid图表条形图的数据标签
- string - Scala通过反引号拆分字符串