handling select_related and prefetch_reated, semi-automatically
Project description
(this is experimental package)
handling select_related and prefetch_reated, semi-automatically.
from django_aggressivequery import from_queryset
(
from_queryset(UserInfo.objects.filter(point__gt=0), ["user__teams__games"])
.prefetch_filter(
user__teams__games=lambda qs: qs.filter(name__contains="-a")
)
)
# almost same means
from django.db.models import Prefetch
(
UserInfo.objects.filter(point__gt=0)
.select_related("user")
.prefetch_related(
"user__teams",
Prefetch("user__teams__games", queryset=Game.objects.filter(name__contains="-a"))
)
)
SQL example
SELECT
"userinfo"."id", "userinfo"."point", "userinfo"."ctime", "userinfo"."user_id",
"user"."id", "user"."name", "user"."ctime"
FROM "userinfo"
INNER JOIN "user" ON ("userinfo"."user_id" = "user"."id")
WHERE "userinfo"."point" > 0;
SELECT
("team_users"."user_id") AS "_prefetch_related_val_user_id",
"team"."id", "team"."name", "team"."price", "team"."ctime"
FROM "team"
INNER JOIN "team_users" ON ("team"."id" = "team_users"."team_id")
WHERE "team_users"."user_id" IN (2);
SELECT
"game"."id", "game"."team_id", "game"."name", "game"."price", "game"."ctime"
FROM "game"
WHERE ("game"."name" LIKE '%-a%' ESCAPE '\' AND "game"."team_id" IN (1, 2));
model
# relation: UserInfo - User *-* Team -* Game
class User(models.Model):
name = models.CharField(max_length=255, default="", null=False)
ctime = models.DateTimeField()
class UserInfo(models.Model):
point = models.IntegerField(null=False, default=0)
user = models.OneToOneField(User, related_name="info")
ctime = models.DateTimeField()
class Team(models.Model):
users = models.ManyToManyField(User, related_name="teams")
name = models.CharField(max_length=255, default="", null=False)
price = models.IntegerField(null=False, default=0)
ctime = models.DateTimeField()
class Game(models.Model):
team = models.ForeignKey(Team, related_name="games")
name = models.CharField(max_length=255, default="", null=False)
price = models.IntegerField(null=False, default=0)
ctime = models.DateTimeField()
more specific option
Calling from_queryset() with more_specific option, then use Query.only().
from django_aggressivequery import from_queryset
(
from_queryset(UserInfo.objects.filter(point__gt=0), ["point", "user__name", "user__teams__name", "user__teams__games__name"], more_specific=True)
.prefetch_filter(
user__teams__games=lambda qs: qs.filter(name__contains="-a")
)
)
0.2.0: skipping function support (AggressiveQuery.skip_filter())
0.1.2: gentle type check, in from_query()
0.1.1: remove need less join (on prefetch releated)
0.1: first release
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for django-aggressivequery-0.2.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7590d8dad750f97577fb725a78497826078205060ac570932683bb82a9de97a |
|
MD5 | 5404ebd742a840c735016ed9cb0a1385 |
|
BLAKE2b-256 | 10c5c1d335f8e4999695c9078a17d7f17313a1bcdcfde731bd75710fc8bf79bf |
Close
Hashes for django_aggressivequery-0.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3d99697c5a96ea91f838cf9e688d84340664f481dcbf1603b703d7a2f6ceb68e |
|
MD5 | 8b5307b379606d38abfedbed725d9029 |
|
BLAKE2b-256 | df1053d7e0f741202c899675f443d2cf88a29fa67dcd9fd2244f07974dce767c |