是否有内置的方法来过滤Django中的给定功能?

时间:2016-09-09 12:56:09

标签: python django postgresql filter

我特别想知道我是否可以使用Django模型实例来映射,过滤和减少函数。如果我不能,是否有一种内置的方法来传递一个函数来过滤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)"
    )

如上所示,我在stops_forwardsstops_backwards中嵌入了ArrayFields。我使用嵌入式的,以保持秩序。示例数据如下所示:

[
    [1, 35],
    [2, 40],
    [3, 180],
    [4, 285]
    # ... and it goes
]

我想要做的是检查特定的停止ID(如285)是否在嵌入式ArrayField中。假设我有一个名为has_route_stop的函数,我不知道它是如何工作的,但我将其称为如下:

filter(lambda: has_route_stop(285), instances)

或者,Django API中是否有内置方法来执行此操作?

环境

  • Python 3.5.1
  • Django 1.9.9
  • PostgreSQL 9.5.4
  • psycopg2 2.6.2

1 个答案:

答案 0 :(得分:3)

Django的Postgres集成允许您使用__contains运算符在嵌入式数组中进行查询。所以你可以这样做:

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

请参阅the ArrayField documentation