3

既存のスラッグを検索する必要がある1回限りのデータインポーターを実装しています。ナメクジは配列になっています。OR配列をクエリに変換するために受け入れられているベストプラクティスの方法は何ですか?

私は次のことを思いつきました。これは機能しますが、これほど単純なことを実現するにはコードが多すぎるように感じます。

# slug might be an array or just a string
# ex:
slug = [ "snakes", "snake-s" ] # in the real world this is generated from directory structure on disk

# build the query
query = MyModel.objects
if hasattr(slug, "__iter__"):
    q = Q()
    for s in slug:
        q = q.__or__(Q(slug=s))
    query = query.filter(q)
else:
    query = query.filter(slug=slug)
4

4 に答える 4

4
slug = ["snakes", "snake-s" ] # in the real world this is generated from directory structure on disk

# build the query
query = MyModel.objects
if hasattr(slug, "__iter__"):
    q_list = []
    for s in slug:
        q_list.append(Q(slug=s))
    query = query.filter(reduce(operator.or_, q_list))
else:
    query = query.filter(slug=slug)
  • q_list = []Q句のリストを作成する
  • reduce(operator.or_, q_list)または演算子を使用してリストを内包する

これを読んでください:http://www.michelepasin.org/techblog/2010/07/20/the-power-of-djangos-q-objects/

@MostafaR-必要に応じて、コードブロック全体を1行にまとめることができます(以下を参照)。しかし、そのレベルではもうあまり読みにくいです。コードが縮小されておらず、曖昧になっているという理由だけで、コードが「Pythonic」ではないと言うのはばかげています。読み取り可能なコードは私見王です。reduce私の答えの目的は、オペレーターのテクニックで示すことであったことを覚えておくことも重要です。私の答えの残りは、元の質問に関連してそのテクニックを示すための綿毛でした。

result = MyModel.objects.filter(reduce(operator.or_, [Q(slug=s) for s in slug])) if hasattr(slug, "__iter__") else MyModel.objects.filter(slug=slug)
于 2012-08-27T20:31:39.630 に答える
1
result = MyModel.objects.filter(slug__in=slug).all() if isinstance(slug, list) else MyModel.objects.filter(slug=slug).all()
于 2012-08-27T20:30:05.247 に答える
0

この場合、次のようにdjangoの__inフィールドルックアップを使用する必要があると思います。

slugs = [ "snakes", "snake-s" ]
objects = MyModel.objects.filter(slug__in=slugs)
于 2012-08-27T20:28:03.847 に答える
-1

あなたが投稿したコードは多くの点で機能しませんが(しかし、それがもっと擬似コードであるべきかどうかはわかりませんか?)、私が理解していることから、これは役立つかもしれません:

MyModel.objects.filter(slug__in=slug)

仕事をする必要があります。

于 2012-08-27T20:23:19.087 に答える