Как проверить содержание в массиве django? - PullRequest
2 голосов
/ 25 февраля 2020

Я работаю с django моделями в Python, где одним из полей модели является ArrayField из id, и, учитывая заданный c экземпляр модели с ArrayField в качестве поля, я хочу проверить если данный идентификатор находится в ArrayField этого экземпляра. Я попытался сделать x in self.exampleArrayField, но я получил Value 'self.exampleArrayField' doesn't support membership test Я также попытался x in list(self.exampleArrayField), но я не знаю, работает ли это вообще (мой редактор vscode не выдает ошибку, но это Python I ' м работаю в). Есть ли хороший способ сделать то, что я пытаюсь сделать?

1 Ответ

1 голос
/ 25 февраля 2020

Вы хотите использовать методы ORM для достижения этой цели.

Например, посмотрите документацию по ArrayFields

У нас есть эта модель

from django.contrib.postgres.fields import ArrayField
from django.db import models

class Post(models.Model):
    name = models.CharField(max_length=200)
    tags = ArrayField(models.CharField(max_length=200), blank=True)

    def __str__(self):
        return self.name

Чтобы найти сообщения, помеченные как "django"

>>> Post.objects.filter(tags__contains=['django'])
<QuerySet [<Post: First post>, <Post: Third post>]>

Здесь tags__contains расширяется до специального фильтра, который фактически выполняет запросы в массиве с использованием PostgreSQL функций.

В качестве альтернативы вы можете использовать недостаточно документированный to_python метод .

, который для вашего примера будет:

x in self.exampleArrayField.to_python()

Однако , внимательно посмотрите на ваш код и подумайте, действительно ли это необходимо. Если вы зацикливаетесь на куче Python объектов и вызываете этот метод, вы теряете 100% выигрыша в производительности от Postgres работы с массивами с использованием ORM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...