Django NotEqual пользовательский поиск в методе исключения
Я зарегистрировал пользовательский поиск на основе этого ответа и официальной документации.
# core/custom_lookup.py
from django.db.models import Lookup
class NotEqual(Lookup):
"""Missing != operator."""
lookup_name = 'ne'
def as_sql(self, *args):
lhs, lhs_params = self.process_lhs(*args)
rhs, rhs_params = self.process_rhs(*args)
return '{} <> {}'.format(lhs, rhs), lhs_params + rhs_params
Я зарегистрировал пользовательский поиск в конфигурации моего приложения.
# core/apps.py
from django.apps import AppConfig
from django.db.models import Field
from .custom_lookup import NotEqual
class CoreConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'core'
def ready(self):
Field.register_lookup(NotEqual)
Затем я использую его в методе исключения таким образом.
Customer.objects.all().filter(filter).exclude(private=True, user__ne=info.context.user).order_by('-created')
Идея здесь заключается в том, чтобы получить всех клиентов, где user является info.context. user (при этом private является False или True) OR user является NOT info.context. user but private is False but exclude customers where user is NOT info. context.user AND private is True
Но всякий раз, когда я воспроизвожу запрос, возникает следующая ошибка
Связанное поле получило недействительный поиск: ne
Я что-то упустил в регистрации поиска?
Я немного поизучал и нашел способ. Вы должны добавить поиск связанного поля, потому что пользователь является ForeignKey или OneToOneField, я полагаю, Итак, код таков,
core/custom_lookup.py
from django.db.models import Lookup
from django.db.models.fields.related_lookups import RelatedLookupMixin
class NotEqual(Lookup):
"""Missing != operator."""
lookup_name = 'ne'
def as_sql(self, *args):
lhs, lhs_params = self.process_lhs(*args)
rhs, rhs_params = self.process_rhs(*args)
return '{} <> {}'.format(lhs, rhs), lhs_params + rhs_params
class NotEqualRelated(RelatedLookupMixin, Lookup):
"""Missing != operator."""
lookup_name = 'nere'
def as_sql(self, *args):
lhs, lhs_params = self.process_lhs(*args)
rhs, rhs_params = self.process_rhs(*args)
return '{} <> {}'.format(lhs, rhs), lhs_params + rhs_params
core/apps.py
from django.apps import AppConfig
from django.db.models import Field
from .custom_lookup import NotEqual, NotEqualRelated
from django.db.models.fields.related import RelatedField, OneToOneField
class MainConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'main'
def ready(self):
Field.register_lookup(NotEqual)
OneToOneField.register_lookup(NotEqualRelated)
В вашем случае вам может понадобиться добавить ForeignKey.register_lookup . Пожалуйста, попробуйте этот код и дайте мне знать, если у вас возникнут какие-либо проблемы.