次のセットアップがあります。django-rest-framework と django-model-utils InheritanceManager を使用して、子オブジェクトを自動的に取得しています。
models.py:
class Location(models.Model):
address = models.CharField(max_length=255)
class OfferParent(models.Model):
location = models.OneToOneField(Location)
...
objects = InheritanceManager()
class OfferChild(OfferParent):
...
serializers.py:
class LocationSerializer(ModelSerializer):
class Meta:
model = Location
class OfferSerializer(ModelSerializer):
location = LocationSerializer()
class Meta:
model = Offer
view.py:
class OfferViewSet(ModelViewSet):
...
def get_queryset(self):
return Offer.objects.select_related('location').all().select_subclasses()
私の問題は、select_related
が正しく機能していないことです。検索アクションを呼び出すと、デバッグ ツールバーに 1 つではなく 2 つのクエリが表示されます。1 つ目は、ロケーション テーブルとの予想される内部結合です。ただし、ロケーション テーブルへの追加のクエリがあります。
SELECT ••• FROM "offers_offerlocation" WHERE "offers_offerlocation"."id" = 92
だから私はselect_related
テーブルを結合するために使用していますが、どういうわけかシリアライザーはデータベースに追加のクエリを作成します。
残りのフレームワークを使用せずにオブジェクトを直接取得すると、
Offer.objects.select_related('location').select_subclasses().first()
例外として機能し、データベースに1回だけヒットします。
これを解決する方法を知っている人はいますか?