Home > Enterprise >  Django NotEqual custom lookup on related field
Django NotEqual custom lookup on related field

Time:09-18

I registered a custom lookup base on this answer and official documentation.

# 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

I registered the custom lookup in my app config.

# 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)

Then i use it in the exclude method this way.

Customer.objects.all().filter(filter).exclude(private=True, user__ne=info.context.user).order_by('-created')

The idea here is to get all the customers where user is info.context.user (with private is False or True) OR user is NOT info.context.user but private is False but exclude customers where user is NOT info.context.user AND private is True

But whenever I play the query the error below is thrown

Related Field got invalid lookup: ne

Am I missing something on the registration of the lookup?

CodePudding user response:

I bit explored and found the way. You should add Related field lookup because user is ForeignKey or OneToOneField I guess, So the code is,

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)

In your case you may need to add ForeignKey.register_lookup . please take a try this code and let me know if you face any issues.

  • Related