Python Django中是否有一种内置的方法可以使用给定的函数进行过滤?
我特别想知道我是否可以在Django模型实例中使用map、filter和reduce函数。如果我不能,是否有一种内置的方法来传递函数以过滤Django中的查询 让我展示一下我真正的问题,以便更好地理解。我使用PostgreSQL来使用ArrayField,我有如下类似的模型:Python Django中是否有一种内置的方法可以使用给定的函数进行过滤?,python,django,postgresql,filter,Python,Django,Postgresql,Filter,我特别想知道我是否可以在Django模型实例中使用map、filter和reduce函数。如果我不能,是否有一种内置的方法来传递函数以过滤Django中的查询 让我展示一下我真正的问题,以便更好地理解。我使用PostgreSQL来使用ArrayField,我有如下类似的模型: class Route(models.Model): stops_forwards = ArrayField( ArrayField( models.PositiveIntegerField
class Route(models.Model):
stops_forwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Forwards (Ordered)"
)
stops_backwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Backwards (Ordered)"
)
[
[1, 35],
[2, 40],
[3, 180],
[4, 285]
# ... and it goes
]
filter(lambda: has_route_stop(285), instances)
正如您在上面看到的,我在stops\u forward
和stops\u backward
中嵌入了数组字段。我使用嵌入式的,以保持秩序。示例数据如下所示:
class Route(models.Model):
stops_forwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Forwards (Ordered)"
)
stops_backwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Backwards (Ordered)"
)
[
[1, 35],
[2, 40],
[3, 180],
[4, 285]
# ... and it goes
]
filter(lambda: has_route_stop(285), instances)
我要做的是检查嵌入式ArrayField中是否有特定的停止id(如285
)。假设我有一个名为的函数has_route_stop
,我不知道它是如何工作的,但我调用它如下:
class Route(models.Model):
stops_forwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Forwards (Ordered)"
)
stops_backwards = ArrayField(
ArrayField(
models.PositiveIntegerField(),
size=2
),
default=[],
verbose_name="Stops Backwards (Ordered)"
)
[
[1, 35],
[2, 40],
[3, 180],
[4, 285]
# ... and it goes
]
filter(lambda: has_route_stop(285), instances)
或者,DjangoAPI中是否有内置的方法来实现这一点
环境
- Python 3.5.1
- Django 1.9.9
- PostgreSQL 9.5.4
- psycopg2 2.6.2
\u contains
操作符在嵌入式阵列中进行查询。因此,您可以:
Route.objects.filter(stops_forwards__contains=[285])
参阅
:“提示:数组不是集合;搜索特定数组元素可能是数据库错误设计的一个标志。考虑使用一个单独的表,每个条目都是一个数组元素。这将更容易搜索,并且对于大量元素可能会更好地扩展。”是的,这是一个更好的解决方案。然而,我编写的自定义脚本以某种方式混合了数据顺序(或者在Django查询时将其洗牌,我不知道)。所以我认为将它们的顺序保持为整数是一个更好的解决方案。但我会尽我所能避免使用嵌入式阵列。谢谢。:)