Можете ли вы помочь мне написать идеальный запрос ORM для django с postgres по следующим критериям? - PullRequest
0 голосов
/ 16 апреля 2020

Итак, у меня есть такая модель,

    class AlphabetArray(models.Model):
        slug = ArrayField(
                        models.CharField(max_length=50, blank=True),
                        null=True,default=list)

И в поле slug у нас могут быть такие значения, как ['a','b','c',.....'z'] Можно ли запросить эту модель так, чтобы я получал объекты с слагы, содержащие только один или оба из списка ['d','e'], но не любой другой алфавит?

Итак, я запрашиваю объекты с 'd', 'e' или обоими 'd' и 'e' а не другие алфавиты?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Для тех, кто ищет ответ на этот вопрос,

alphabets = AlphabetArray.objects.filter( Q ( slug__contained_by=['d','e'] ) | Q ( slug__len__gte=1)

0 голосов
/ 17 апреля 2020

Вам необходимо проверить наличие 2 перекрытий:

  1. Целевой массив перекрывает массив ['d', 'e']
  2. Целевой массив не массив перекрытий ['a', 'b', 'c', 'f' ... 'z']

Следующее выполняется в SQL, так как я не ' django вам придется адаптировать его. Вам не понадобится ни CTE, ни select_it в финале, но они полезны для тестирования.

-- setup test cases
with test_array_sets (test_array,select_it) as 
   ( values (array['d','e'],'Yes') 
          , (array['d','e','f'],'No')
          , (array[]::text[],'No')
          , (array['x','y','z'],'No')
          , (array['d'],'Yes')
          , (array['e'],'Yes')
    )
-- actual query needed,  
select target_array, select_it
  from test_array_sets
 where not target_array && array['a','b','c','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
   and target_array && array['d','e'] ; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...