3

次のセットアップがあります。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回だけヒットします。

これを解決する方法を知っている人はいますか?

4

0 に答える 0