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