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_query
(
from_query(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_query() with more_specific option, then use Query.only().
from django_aggressivequery import from_query
(
from_query(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")
)
)
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
Close
Hashes for django-aggressivequery-0.1.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 13993bb6868656db297e293546a61f96981d75203d34c2a8540a1058d12e3fa3 |
|
MD5 | 5d37f4c371996a1cc3e852c4ba842a9c |
|
BLAKE2b-256 | d9ac39164f0820bde198fffd1fe8745b6a432f8c89a8b4dcb376a7f0276da85b |