Django prefetch_related в свойстве наследуемой модели - PullRequest
1 голос
/ 17 марта 2020

У меня проблема с prefetch_related для свойства унаследованной модели.

В models.py У меня есть:

class Security(models.Model):
    name = models.TextField()
    ...other fields

class Fund(Security):
    ...other fields

    @property
    def underlying_security(self):
        return self.maps_when_mapped.get().original_security

class SecurityToSecurityMap(models.Model):
    original_security = models.ForeignKey(Security, related_name="maps_when_original")
    mapped_security = models.ForeignKey(Security, related_name="maps_when_mapped")

и в serializers.py

class UnderlyingSecuritySerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField()

class FundSerializer(serializers.ModelSerializer):
    underlying_security = UnderlyingSecuritySerializer(read_only=True, allow_null=True)

    class Meta:
        model = Fund
        fields = ("id", "name", "underlying_security")

Теперь, когда я запрашиваю объекты фонда:

queryset = Fund.objects.prefetch_related("maps_when_mapped__original_security")

Django игнорирует предварительную выборку. Поэкспериментировал с `Prefetch, попробовал перенести свойство в родительский - не повезло, все равно получаю сотни запросов. В любом случае это может быть оптимизировано?

Я использую Django 2.2 с Postgres 11

ОБНОВЛЕНИЕ 1

После просмотра вопроса , Я подозреваю, что проблема в том, что когда я использую .get() в свойстве, он сразу оценивается, но потом не уверен, как его получить без оценки

...