#30631: Prefixing Q Objects
-------------------------------------+-------------------------------------
     Reporter:  efficiosoft          |                    Owner:  nobody
         Type:  New feature          |                   Status:  new
    Component:  Database layer       |                  Version:  2.2
  (models, ORM)                      |
     Severity:  Normal               |               Resolution:
     Keywords:  prefix q objects     |             Triage Stage:
                                     |  Unreviewed
    Has patch:  1                    |      Needs documentation:  1
  Needs tests:  1                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by efficiosoft):

 * needs_docs:  0 => 1
 * needs_tests:  0 => 1


Old description:

> I'm currently spending a lot of time on development of a project using
> Django and worked out something that I think could be of use for all
> Django users.
>
> I added a new `.prefix(prefix)` method to the `Q` object, allowing to
> shift pre-built `q` objects to a related field. I think this can change
> the way people build managers completely, because instead of methods
> returning filtered querysets, one can just return `Q` objects, which can
> then be used from related models without repeating the filtering logic.
>
> This is the simple implementation.
>
> ```
> class Q(django.db.models.Q):
>     """
>     A custom Q implementation that allows prefixing existing Q objects
> with some
>     related field name dynamically.
>     """
>
>     def prefix(self, prefix):
>         """Recursively copies the Q object, prefixing all lookup keys.
>
>         The prefix and the existing filter key are delimited by the
> lookup separator __.
>         Use this feature to delegate existing query constraints to a
> related field.
>         """
>         return type(self)(
>             *(
>                 child.prefix(prefix)
>                 if isinstance(child, Q)
>                 else (prefix + LOOKUP_SEP + child[0], child[1])
>                 for child in self.children
>             ),
>             _connector=self.connector,
>             _negated=self.negated,
>         )
> ```
>
> What do you think, is it worth creating a PR for this functionality? I
> haven't written the docs yet, but could write something if you like the
> addition.
>
> Best regards
> Robert

New description:

 I'm currently spending a lot of time on development of a project using
 Django and worked out something that I think could be of use for all
 Django users.

 I added a new `.prefix(prefix)` method to the `Q` object, allowing to
 shift pre-built `q` objects to a related field. I think this can change
 the way people build managers completely, because instead of methods
 returning filtered querysets, one can just return `Q` objects, which can
 then be used from related models without repeating the filtering logic.

 This is the simple implementation.

 {{{
 class Q(django.db.models.Q):
     """
     A custom Q implementation that allows prefixing existing Q objects
 with some
     related field name dynamically.
     """

     def prefix(self, prefix):
         """Recursively copies the Q object, prefixing all lookup keys.

         The prefix and the existing filter key are delimited by the lookup
 separator __.
         Use this feature to delegate existing query constraints to a
 related field.
         """
         return type(self)(
             *(
                 child.prefix(prefix)
                 if isinstance(child, Q)
                 else (prefix + LOOKUP_SEP + child[0], child[1])
                 for child in self.children
             ),
             _connector=self.connector,
             _negated=self.negated,
         )
 }}}

 What do you think, is it worth creating a PR for this functionality? I
 haven't written the docs yet, but could write something if you like the
 addition.

 Best regards
 Robert

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/30631#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/069.a64aaf57e45796e8c71de26a7f998510%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to