Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中是否有一种内置的方法可以使用给定的函数进行过滤?_Python_Django_Postgresql_Filter - Fatal编程技术网

Python Django中是否有一种内置的方法可以使用给定的函数进行过滤?

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

我特别想知道我是否可以在Django模型实例中使用map、filter和reduce函数。如果我不能,是否有一种内置的方法来传递函数以过滤Django中的查询

让我展示一下我真正的问题,以便更好地理解。我使用PostgreSQL来使用ArrayField,我有如下类似的模型:

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

Django的Postgres集成允许您使用
\u contains
操作符在嵌入式阵列中进行查询。因此,您可以:

Route.objects.filter(stops_forwards__contains=[285])

参阅

:“提示:数组不是集合;搜索特定数组元素可能是数据库错误设计的一个标志。考虑使用一个单独的表,每个条目都是一个数组元素。这将更容易搜索,并且对于大量元素可能会更好地扩展。”是的,这是一个更好的解决方案。然而,我编写的自定义脚本以某种方式混合了数据顺序(或者在Django查询时将其洗牌,我不知道)。所以我认为将它们的顺序保持为整数是一个更好的解决方案。但我会尽我所能避免使用嵌入式阵列。谢谢。:)