Metadata-Version: 2.0
Name: django-aggressivequery
Version: 0.3.2
Summary: handling select_related and prefetch_reated, semi-automatically
Home-page: https://github.com/podhmo/django-aggressivequery
Author: podhmo
Author-email: UNKNOWN
License: UNKNOWN
Keywords: django restframework return_fields
Platform: UNKNOWN
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Framework :: Django
Classifier: License :: OSI Approved :: BSD License
Requires-Dist: django
Provides-Extra: docs
Provides-Extra: testing
Requires-Dist: tox; extra == 'testing'

django-aggressivequery
========================================

(this is experimental package)

handling select_related and prefetch_reated, semi-automatically.


.. code-block:: python

  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

.. code-block:: sql

  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

.. code-block:: python

  # 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()`.

.. code-block:: python

  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.3.1:

- fix bug when unexpected relations are found.

0.3.0:
- fix bug that duplicated hints are occured
- fix bug that `get_accessor_name()` method is not used
- adding extension feature.
- reimplementing `skip_filter()` as extension
- implementing `custom_prefetch()` as extension
- reimplementing `prefetch_filter()` as extension
- (module separation)

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


