python - 在 Django 更新方法中使用 F() 表达式
问题描述
我有一个名为Tree
表示树对象的 Django 模型,它包含x
并y
协调类型的字段FloatField
。我正在尝试使用以下命令调用 Django 的update
方法来初始化每个树对象的PointField
调用:coordinates
Tree.objects.all().update(coordinates=Point(F('x'), F('y')))
如果我从文档中正确理解,我将需要使用F()
表达式在数据库级别访问每个树对象的字段。
但是,这不起作用并导致以下错误:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
output = self.handle(*args, **options)
File "/usr/src/app/app/tree_api/management/commands/update_coords.py", line 47, in handle
Tree.objects.all().update(coordinates=Point(F('x'), F('y')))
File "/usr/local/lib/python3.8/site-packages/django/contrib/gis/geos/point.py", line 35, in __init__
raise TypeError('Invalid parameters given for Point initialization.')
TypeError: Invalid parameters given for Point initialization.
我想要实现的目标可以使用以下原始 SQL 查询来完成(使用 PostgreSQL 和 PostGIS):
UPDATE tree_column_name
SET coordinates = ST_GeomFromText('POINT(' || x || ' ' || y || ')');
是否可以使用 Django ORM 的方法初始化PointField
fromx
和values而无需编写原始 SQL 查询?y
update
解决方案
让我们尝试Func
:
from django.db.models import F, Func
from django.contrib.gis.db import models
from yourapp.models import Tree
(
Tree
.objects
.all()
.update(
coordinates=Func(F('x'), F('x'), function='ST_Point')
)
)
推荐阅读
- html - 我试图让我的整个网页居中,但它不会让我
- javascript - React - 在点击时遇到问题(React)
- r - 在 R 中使用 mutate(across) 计算同一日期的每日平均值
- r - 如何按行数过滤嵌套的数据框列表并从 R 中的列表中删除过滤的数据框?
- apollo - dataIdFromObject 错误地覆盖来自其他查询的缓存
- git - 我需要帮助处理 GitHub 上的大文件来帮助我的学校
- antlr - 在 ANTLR 4 Parse Tree 中获取正确的令牌 StopIndex 的问题
- gobblin - 运行 cli 命令时没有加载 GobblinCli
- android - MediaStore.Files.FileColumns.DATA 已被弃用,改用什么?
- python - 以太网数据不总是包含IP数据包吗?