6

特定のモデルのクエリセットの内容を表示するための非常に一般的なビュー/テンプレートがあります。
私は 12 の場所から 12 の異なるクエリセットを使用しています。干し草の山検索をそこに統合したかったのですが、SearchQuerySet がテンプレート内の QuerySet と一致しないためできません。

私が行う通常のクエリセットで

{%for obj in qs%}
    {{obj.foreign_key.name }}
{%endfor%}

SearchQuerySet を使用すると、私が行う必要があります

{%for obj in qs%} 
   {{obj.object.foreign_key.name}}
{%endfor%}

これは基本的に、クエリセットがどこから来たのかを知っている私の汎用テンプレートとビューを壊します。

searchqueryset を通常のクエリセットのように動作させる方法が欲しいのですが、次のことを認識しています。

  • 順番は守れるけど点数は負ける
  • オブジェクト全体を取得するには、 load_all() を実行する必要があります

テンプレートをジェネリックに保ちながら、 SearchQuerySet を受け入れるか、 SearchQuerySet を QuerySet に変換する方法についてのヒントはありますか?

4

4 に答える 4

4

モデルに と呼ばれるメソッドを追加してobject、クエリセットが SearchQuerySet のように動作するようにするにはどうすればよいでしょうか? 例えば

class MyModel(models.Model):
    ...

    @property
    def object(self):
        return self
于 2012-12-05T21:35:04.327 に答える
1

SQSをQSのように扱うためのより一般的なアプローチを探してここに来た他の人のために.

Django Rest Framework にこのようなものが必要だったので、sqs -> qs 用に次のラッパーを作成しました。これにより、反復とスライスのサポートが制限されたクエリセットであるかのように SQS を処理できます。

ジェネレーター関数で反復する前に load_all を呼び出すこともできます。

class SearchQuerySetWrapper(object):
    """
    Decorates a SearchQuerySet object using a generator for efficient iteration
    """
    def __init__(self, qs):
        self.qs = qs

    def count(self):
        return self.qs.count()

    def __iter__(self):
        for result in self.qs:
            yield result.object

    def __getitem__( self, key):
        if isinstance(key, int) and (key >= 0 or key < self.count()):
            # return the object at the specified position
            return self.qs[key].object
        # Pass the slice/range on to the delegate
        return SearchQuerySetWrapper(self.qs[key])
于 2014-11-21T20:08:56.650 に答える