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 . Пожалуйста, попробуйте этот код и дайте мне знать, если у вас возникнут какие-либо проблемы.

Вернуться на верх