Как сделать запрос на базе base_field Django ArrayField - PullRequest
0 голосов
/ 03 апреля 2020

Могу ли я запросить base_field для Django ArrayField?

Например, можно ли отфильтровать «регионы с внешним почтовым индексом, который соответствует данному почтовому индексу»?

Рассмотрим следующую модель:

models.py:

from django.contrib.postgres.fields import ArrayField

class Region(models.Model):
  outer_postcodes = ArrayField(models.CharField(blank=True, null=True), blank=True, null=True)

region = Region(outer_postcodes=["SW1", "NW1"]
assert Region.objects.my_clever_filter("SW1A").count() == 1
assert Region.objects.my_clever_filter("SW2B").count() == 0

Каким должен быть <my_clever_filter>?

I ' мы думали о чем-то вроде:

.annotate(
    postcode_to_search=Value("SW1A", output_field=models.CharField()),
    outer_postcodes_regex=Concat(
        Value("^"),
        Replace(
            Replace(
                Replace(
                    Func(F("outer_postcodes"), function="Concat"),
                    Value(","), 
                    replacement=Value("|"),
                ),
                Value("{"),
            ),
            Value("}"),
        )
    ),
).filter(postcode_to_search__iregex=F("outer_postcodes_regex"))

Это работает! Но Concat и вложенные Replace довольно уродливы.


этот ответ помог мне зайти так далеко: { ссылка }

...