Django-filter: 外部キーモデルの属性によるフィルタリング

作成日 2019年01月09日  ·  4コメント  ·  ソース: carltongibson/django-filter

やあ!

私は仕事で問題に取り組んでいて、それに取り組む最も慣用的な方法は何であるか疑問に思いました。 モデルの外部キー用に複数のModelMultipleChoiceFilterフィルターフィールドがあります。 URLで主キーを公開せずに、 CheckboxSelectMultipleウィジェットを使用しながら、外部キーの一意の属性でフィルタリングする方法を見つけようとしています。

これは、(多かれ少なかれ)私が今どのように設定しているかを示す例です。

# app/models.py
from django.db import models

class Foo(models.Model):
    prop = models.CharField(max_length=55, unique=True)

    def __str__(self):
        return self.name


class Bar(models.Model):
    foo = models.ForeignKey(Foo, related_name="bars")
# app/filters.py
import django_filters
from app.models import Bar, Foo

class BarFilter(django_filters.FilterSet):
    foo = django_filters.ModelMultipleChoiceFilter(
        queryset=Foo.objects.all(),
        widget=CheckboxSelectMultiple(),
        label="Foo",
        label_suffix="",
    )

    class Meta:
        model = bar
        fields = ['foo']

これは、ビューではまったく問題なく機能します。 フィルタは機能し、適切なウィジェットで正しくフィルタリングします。 ただし、URLには主キーが含まれているため、この例では/?foo=1ですが、pkが公開されないようにし、URLを読みやすくするために、 /?foo=<prop value>読み取ります。

Djangoの他の場所では機能する傾向があるため、このようなフィールドを変更してみました。

# app/filters.py
...snip...
    class Meta:
        model = bar
        fields = ['foo__prop']

これにより、URLは必要に応じて/?foo=<prop value>応答しますが、フォームにCheckboxSelectMultipleを使用しなくなりました。 属性をfoo__propにもしようとしましたが、フォームのレンダリングが正しくありませんでした。

私がやろうとしていることは、ほとんど機能していることを考えるとサポートされているように感じますが、それを取得する方法がよくわからないようです。 これが現在サポートされている範囲外の場合は、これを処理するための独自のフォームを作成できます。 助けてくれて、素晴らしいプロジェクトをありがとう!

最も参考になるコメント

こんにちは、返信に時間を割いていただきありがとうございます!

あなたは私を正しい軌道に乗せました! 私は昨日これを実装する機会を得ました、そしてfield_name引数を使うことはうまくいきました!

この問題を読む可能性のある将来の人のために、コードがどのように出てきたかは次のとおりです。

# app/filters.py
...snip
class BarFilter(django_filters.FilterSet):
    foo = django_filters.ModelMultipleChoiceFilter(
        queryset=Foo.objects.all(),
        field_name="foo__prop", # This lets us keep the url as "/?foo=<value>
        to_field_name="prop",
        widget=CheckboxSelectMultiple(),
        label="Foo",
        label_suffix="",
    )

    class Meta:
        model = bar
        fields = ['foo']

これへの参照は、 @ carltongibsonが言及したスレッドのドキュメントにあります。 具体的には、ModelMultipleChoiceフィルターのセクションを参照してください。

とにかく、私を助けるために時間を割いてくれてありがとう!

全てのコメント4件

ひや。 いい問題です。 厳密には使用法の質問ですが、よく読んでいただければ幸いです。

フィルタのfield_name引数を見ましたか?
https://django-filter.readthedocs.io/en/master/ref/filters.html

これにより、foo_propをfooフィルターのターゲットとして使用できるようになります。

私はそれがうまくいくと想像します...多分あなたはウィジェットなどで選択を設定する必要があるでしょう(しかしそれは処理されるべきです...)

こんにちは、返信に時間を割いていただきありがとうございます!

あなたは私を正しい軌道に乗せました! 私は昨日これを実装する機会を得ました、そしてfield_name引数を使うことはうまくいきました!

この問題を読む可能性のある将来の人のために、コードがどのように出てきたかは次のとおりです。

# app/filters.py
...snip
class BarFilter(django_filters.FilterSet):
    foo = django_filters.ModelMultipleChoiceFilter(
        queryset=Foo.objects.all(),
        field_name="foo__prop", # This lets us keep the url as "/?foo=<value>
        to_field_name="prop",
        widget=CheckboxSelectMultiple(),
        label="Foo",
        label_suffix="",
    )

    class Meta:
        model = bar
        fields = ['foo']

これへの参照は、 @ carltongibsonが言及したスレッドのドキュメントにあります。 具体的には、ModelMultipleChoiceフィルターのセクションを参照してください。

とにかく、私を助けるために時間を割いてくれてありがとう!

素晴らしい。 解決してよかったです。 素晴らしい!

よくやった ! ありがとうございました !

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

sassanh picture sassanh  ·  4コメント

edmorley picture edmorley  ·  3コメント

chromakey picture chromakey  ·  5コメント

hakib picture hakib  ·  3コメント

jnegro picture jnegro  ·  3コメント