#31083: Add select_related support for Site.objects.get_current
---------------------------------+--------------------------------------
     Reporter:  Kris Ciccarello  |                    Owner:  nobody
         Type:  New feature      |                   Status:  new
    Component:  contrib.sites    |                  Version:  3.0
     Severity:  Normal           |               Resolution:
     Keywords:                   |             Triage Stage:  Unreviewed
    Has patch:  0                |      Needs documentation:  0
  Needs tests:  0                |  Patch needs improvement:  0
Easy pickings:  0                |                    UI/UX:  0
---------------------------------+--------------------------------------
Description changed by Kris Ciccarello:

Old description:

> Since we cannot extend `Site`, a common pattern is to use a
> `OneToOneField` to extend a `Site` (i.e. with a `SiteDetail` class). When
> performing `request.site = get_current_site(request)` in middleware, it
> would be nice to be able to efficiently load any extended `Site` objects
> onto `request.site` at that time.
>
> Given this class:
>
> ```
> from django.contrib.sites.models import Site
>
> class SiteDetail(models.Model):
>     site = models.OneToOneField(
>         Site, on_delete=models.CASCADE, primary_key=True,
> related_name="detail"
>     )
> ```
>
> The following does not work:
>
> ```
> Site.objects.select_related("detail").get_current(request)
> > AttributeError: 'QuerySet' object has no attribute 'get_current'
> ```
>
> We could add support for something like this:
>
> ```
> Site.objects.get_current(request, select_related=["detail"])
> ```
>
> Which would allow the user to pass through any custom `Site` extensions
> without having to re-write the code in the `Site` manager. Given the use
> of `SITE_CACHE` inside of `SiteManager`, it seems like making this
> addition to its API would be a good step.
>
> Does this make sense, or would another approach be better? Happy to make
> a PR if this would be considered.

New description:

 Since we cannot extend `Site`, a common pattern is to use a
 `OneToOneField` to extend a `Site` (i.e. with a `SiteDetail` class). When
 performing `request.site = get_current_site(request)` in middleware, it
 would be nice to be able to efficiently load any extended `Site` objects
 onto `request.site` at that time.

 Given this class:

 {{{
 from django.contrib.sites.models import Site

 class SiteDetail(models.Model):
     site = models.OneToOneField(
         Site, on_delete=models.CASCADE, primary_key=True,
 related_name="detail"
     )
 }}}



 The following does not work:

 {{{
 Site.objects.select_related("detail").get_current(request)
 > AttributeError: 'QuerySet' object has no attribute 'get_current'
 }}}

 We could add support for something like this:

 {{{
 Site.objects.get_current(request, select_related=["detail"])
 }}}

 Which would allow the user to pass through any custom `Site` extensions
 without having to re-write the code in the `Site` manager. Given the use
 of `SITE_CACHE` inside of `SiteManager`, it seems like making this
 addition to its API would be a good step.

 Does this make sense, or would another approach be better? Happy to make a
 PR if this would be considered.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/31083#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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/065.3dbc91abcabf996950ec090f73749b46%40djangoproject.com.

Reply via email to