gpt4 book ai didi

python - ArrayField 上的 DRF 搜索

转载 作者:太空宇宙 更新时间:2023-11-04 02:41:48 25 4
gpt4 key购买 nike

规范:
django==1.11.5
djangorestframework==3.6.4
x86_64-apple-darwin14.5.0 上的 PostgreSQL 9.6.5,由 Apple LLVM 版本 7.0.0 (clang-700.1.76) 编译,64 位
Python 3.6.2

模型.py

from django.contrib.postgres.fields import ArrayField
from django.db import models
from djchoices import DjangoChoices, ChoiceItem


class Customer(models.Model):
...
phones = ArrayField(models.CharField(max_length=30))

filters.py

import django_filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import FilterSet
from rest_framework.viewsets import ModelViewSet

from soken_web.apps.customers.api.serializers import CustomerSerializer
from soken_web.apps.customers.models import Customer


class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
pass


class CustomerFilter(FilterSet):
phones = CharInFilter(name='phones', lookup_expr='contains')

class Meta:
model = Customer
fields = (
...,
'phones',
)


class CustomerViewset(ModelViewSet):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = CustomerFilter
filter_fields = (
...
'phones',
)

引用资料: https://groups.google.com/forum/#!topic/django-filter/ns7zx1C8HN8

现状:我必须搜索该客户的完全匹配电话号码。
例如 customer.phones = ['024382426', '024387269']
我必须使用 024382426 进行过滤才能获得该客户

问题:如何将电话号码缩写为 438 并获得该客户

最佳答案

ArrayField 实际上是一个列表。对于列表查找,使用 in 关键字。您正在使用 contains,这是针对 CharField 的。您需要像这样将 in 作为 lookup_expr :

import django_filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import FilterSet
from rest_framework.viewsets import ModelViewSet

from soken_web.apps.customers.api.serializers import CustomerSerializer
from soken_web.apps.customers.models import Customer


class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
pass


class CustomerFilter(FilterSet):
phones = NumberInFilter(name='phones', lookup_expr='in')

class Meta:
model = Customer
fields = (
...,
'phones',
)


class CustomerViewset(ModelViewSet):
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
filter_backends = (DjangoFilterBackend,)
filter_class = CustomerFilter
filter_fields = (
...
'phones',
)

对于 Arrayfield,您需要 NumberFilter 代替 CharFilter。这也更新了,请检查。

关于python - ArrayField 上的 DRF 搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com