首先,创建一个自定义查询器。在你的 Django 应用中创建一个新文件,比如 lookups.py:
from django.db.models import Lookup
from django.db.models.fields import Field
class OverlapLookup(Lookup):
lookup_name = 'overlap'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return f"EXISTS (SELECT 1 FROM unnest(string_to_array({lhs}, ',')) AS t(v) WHERE v = ANY(string_to_array({rhs}, ',')))", params
Field.register_lookup(OverlapLookup)
在你的应用的 apps.py 文件中导入这个自定义查询器:
from django.apps import AppConfig
class YourAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'your_app'
def ready(self):
import your_app.lookups # 导入自定义查询器
在视图或其他地方使用查询:
qs = YourModel.objects.filter(a__overlap="3,44,66")