首页 > 解决方案 > 在 Django 更新方法中使用 F() 表达式

问题描述

我有一个名为Tree表示树对象的 Django 模型,它包含xy协调类型的字段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 的方法初始化PointFieldfromx和values而无需编写原始 SQL 查询?yupdate

标签: pythondjangogeodjango

解决方案


让我们尝试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')
    )
)




推荐阅读