3

以下の問題を解決していただければ幸いです。私の状況を説明するために、Django ドキュメントのモデルを使用してみましょう。

models.py

from django.db import models

class Place(models.Model):
    owner = DjangoModels.ForeignKey('Owner', related_name='places')
    objects = PassThroughManager.for_queryset_class(PlaceQuerySet)()

class Restaurant(Place):
    ... some members ...
    objects = PassThroughManager.for_queryset_class(RestaurantQuerySet)()

class Pub(Place):
    ... some members ...
    objects = PassThroughManager.for_queryset_class(PubQuerySet)()

class Owner(models.Model):
    ... some members ...

queryset.py

class PlaceQuerySet(DjangoModels.query.QuerySet):
    .. common place filters ...

class RestaurantQuerySet(PlaceQuerySet):
    .. restaurant specific filters ...

class PubQuerySet(PlaceQuerySet):
    .. pub specific filters ...

上記のように、1 つの基本モデル 'Place' と 2 つのサブモデル 'Restaurant' と 'Pub' があります。ベース モデル 'Place' には 'Owner' オブジェクトへのリンクがあります。クエリセット (PlaceQuerySet、RestaurantQuerySet、PubQuerySet) には、モデル (Place、Restaurant、Pub) と同じ継承階層があります。

私が抱えている課題は、特定の所有者にリンクされた Pub オブジェクトのみを含む PubQuerySet を何らかの形で取得することです....


私が必要とすることを行う 1 つの方法は、所有されている_by(所有者) フィルターを PubQuerySet に追加し、次のように呼び出すことです。

Pub.objects.owned_by(owner)

ただし、「.objects」はプリフェッチされた結果を使用せず、常に DB にヒットするため、パフォーマンスの問題があります。


私の考え:

電話すると

# owner is instance of Owner class
>>owner.places.all()

それは返す

PlaceQuerySet[<Place object ><Place object ><Place object >....]

しかし、どうやって手に入れるのですか

PubQuerySet[<Pub object ><Pub object >]

???

django-model-utils(1) の select_subclasses() メソッドを使用すると、クエリセットでオブジェクトをダウンキャストできることがわかっているので、このようなことをすると

# owner is instance of Owner class
>>owner.places.select_subclasses('pub')

Pub クラスのインスタンスで PlaceQuerySet を取得します

PlaceQuerySet[<Pub object ><Pub object >]

それでも、PubQuerySetではなくPlaceQuerySetを受け取ります...

ご助力ありがとうございます

ジャノ

4

0 に答える 0