Могу ли я запросить 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
довольно уродливы.
этот ответ помог мне зайти так далеко: { ссылка }