This won’t solve your problem but tangentially I’ve made a custom field
lookup for `relatedfield__neq=objectToExclude`

See:
https://docs.djangoproject.com/en/5.1/howto/custom-lookups/

On Tue, Oct 15, 2024 at 3:59 PM Ben Pearman <[email protected]>
wrote:

> Hi all,
>
> We wrote some custom logic that extended the `Query` class. It worked fine
> in 3.2 but not for 4.1, and it started producing invalid SQL. We filed a
> ticket (https://code.djangoproject.com/ticket/35836) but haven't made any
> progress since `Query` is an undocumented API.
>
> Our use case is an automatic site filter - objects belonging to different
> customer sites are automatically filtered to the current site, so each
> queryset doesn't have to be explicitly filtered. We did this at the Query
> level rather than filtering the default manager's `get_queryset`. This has
> the useful effect that our DRF views can define a queryset attribute on
> their class definition (where there isn't a 'current' site) and the query
> will be filtered when it is actually executed (in a request context on a
> particular site)
>
> How should we change our usage of `Query` to fix the bug? Below is the
> contents of the ticket, including a reproduction.
>
> Thanks,
> Ben Pearman
>
> ___
>
> We have observed a bug in the ORM where invalid SQL can be produced.
>
> A reproduction can be seen here:
> ​https://github.com/benpearman/django-orm-bug
> <https://github.com/benpearman/django-orm-bug>
> And specifically:
> ​https://github.com/benpearman/django-orm-bug/blob/master/demo/models.py
> <https://github.com/benpearman/django-orm-bug/blob/master/demo/models.py>
>
> It is caused with the following steps:
>
>    1. Subclassing `django.db.models.sql.Query` and using it in a Queryset
>    mixin
>    2. Creating a queryset with an `exclude()` expression which includes a
>    subquery. EG `Classroom.objects.exclude(student_set__id=student_A.id)`
>    3. Then before calling `super().get_compiler` from our subclassed
>    Query:
>       - Clone the query
>       - Adding a simple expression via `cloned_query.add_q` eg
>       `cloned_query.add_q(Q(school_id=1))`
>       - Passing the cloned query into `super().get_compiler`
>    4. Then evaluate the queryset, which produces invalid SQL and raises
>    `django.db.utils.OperationalError`
>
> Note the issue happens when `get_compiler` is invoked for the subquery,
> not on the main query itself.
>
> This was working for us in Django 3.2, but not for Django 4.1
>
> git bisect shows the breakage was introduced by this commit:
> ​
> https://github.com/django/django/commit/14c8504a37afad96ab93cf82f47b13bcc4d00621
> <https://github.com/django/django/commit/14c8504a37afad96ab93cf82f47b13bcc4d00621>
>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/af1c619d-eaed-4ad8-896f-849d86f9a674n%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/af1c619d-eaed-4ad8-896f-849d86f9a674n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CALmEK1tZjb%2BTYbgTyw7HR86uCKyKakkt0p31g%2BZUtTNdECyBBw%40mail.gmail.com.

Reply via email to