我正在尝试将SQL转换为Django Query:
SELECT * from tbl_name where geometrytype(geometry) LIKE 'POINT';
我已经搜索了它但找不到任何几何类型函数,是否存在?
答案 0 :(得分:1)
根据这个答案google djangouser forum
"你不能,至少不能使用当前的Django版本。 GeoDjango内置 假设几何列仅包含一种几何类型。
但是你应该能够使用.raw()查询来获得你想要的东西。 "
所以我创建了这个查询,它适用于我
queryset = ModelName.objects.extra(where=["geometrytype(geometry) LIKE 'POINT'"])
我正在使用额外功能,因为我必须添加一些其他过滤器,例如
queryset = ModelName.objects.extra(where=["geometrytype(geometry) LIKE 'POINT'"]).filter(verified__isnull=True, btype__contains='PHONE')
<强>更新强>
GeometryType是一个记录GeometryType
的postgis函数GeometryType - 以字符串形式返回几何的类型。例如: &#39; LINESTRING&#39;,&#39; POLYGON&#39;,&#39; MULTIPOINT&#39;等
我想得到几何类型为POINT的所有记录.Howevver Django没有为 GeometryField 提供自定义过滤器。所以我在django查询中放了postgis函数 GeometryType 。
答案 1 :(得分:0)
对于偶然发现此线程的任何人,我只是在Django问题跟踪器上创建了一个故障单,以便在def Graph1a():
g1 = tf.Graph()
with g1.as_default() as g:
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul( matrix1, matrix2, name = "product")
init_op = tf.global_variables_initializer()
sess = tf.Session( graph = g )
sess.run(init_op)
return product
上实施过滤:https://code.djangoproject.com/ticket/28696
答案 2 :(得分:0)
你可以注册一个Lookup
来实现这个功能,例如:
from django.contrib.gis.db.models import GeometryField
from django.db.models import Lookup
class GeometryTypeLookup(Lookup): # type:ignore
"""
Geometry type as a lookup
"""
lookup_name = "type"
prepare_rhs = False
def as_sql(self, compiler: Any, connection: Any) -> Any:
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return "GeometryType(%s) ILIKE %s" % (lhs, rhs), params
GeometryField.register_lookup(GeometryTypeLookup)
然后你像这样使用:
queryset = Feature.objects.filter(geom__type="polygon")
答案 3 :(得分:0)
通过几何类型实现过滤的最简单和最短的方法 (AFAIK) 是通过定义模型 Func 对象来注释查询,然后分别过滤。
from django.db.models import Func
class GeometryType(Func):
function = "GeometryType"
output_field = CharField()
#geom is the model's field name for geometry
filtered_qs = ModelName.objects.annotate(geom_type=GeometryType("geom"))
.filter(geom_type__in={"POINT", "MULTIPOINT"},)