0

ビューに prefetch_related を適用するために、この mixin があります。これは、私が取り組んでいるはずのクエリセットです。

MyMode.objects.all().prefetch_related('projects')

これらのモデルでは:

class Workspace():
 name = models.CharField(max_length=255)
class Project():
 name = models.CharField(max_length=255)
 workspace = models.Foreignkey(Workspace)

私が作成したこのミックスインで:

class PrefetchRelatedMixin(object):
    prefetch_related = None

    def get_queryset(self):
        if self.prefetch_related is None:
            raise ImproperlyConfigured(u'%(cls)s is missing the prefetch_related'
                "property. This must be a tuple or list." % {
                'cls': self.__class__.__name__})

        if not isinstance(self.prefetch_related, (tuple, list)):
            raise ImproperlyConfigured(u"%(cls)s's select_related property "
                "must be a tuple or list." % {"cls": self.__class__.__name__})

        queryset = super(PrefetchRelatedMixin, self).get_queryset()

        return queryset.prefetch_related(
            ", ".join(self.prefetch_related)
        )

次のようにビューで呼び出されます。

class WorkspaceView(DetailView):
    prefetch_related = ['projects']
    model = Workspace

    def get_queryset(self):
        return super(WorkspaceView, self).get_queryset()

ただし、テンプレート内の関連オブジェクトを反復しようとすると、次のようになります。

{% for p in object.projects %}
    <li>{{ p.name }}</li>
{% empty %}
    <li>No Projects in this Workspace</li>
{% endfor %}

次のエラーが表示されます。

'RelatedManager' object is not iterable

RelatedManager を返すようにオブジェクトを変更した mixin の何かがありますか?

前もって感謝します!

4

2 に答える 2

2

@danihp があります: が必要です.all

ここにもエラーがあります:

return queryset.prefetch_related(
            ", ".join(self.prefetch_related)
        )

読むべき

return queryset.prefetch_related(*self.prefetch_related)

prefetch_relatedコンマで区切られた単一の文字列ではなく、複数の文字列引数を取ります。

于 2012-10-26T17:49:02.590 に答える
1

prefetch_relatedは RelatedManager です。結果を取得するにはメソッドを実行する必要があります。

ドキュメントのサンプル:

>>> pizzas = Pizza.objects.prefetch_related('toppings')
>>> [list(pizza.toppings.filter(spicy=True)) for pizza in pizzas]

シナリオの場合:

{% for p in object.projects.all %}
于 2012-10-26T11:45:10.223 に答える