Django-filter: التصفية حسب سمة نموذج المفتاح الخارجي

تم إنشاؤها على ٩ يناير ٢٠١٩  ·  4تعليقات  ·  مصدر: carltongibson/django-filter

أهلا!

كنت أعمل على قضية في العمل وأتساءل ما هي الطريقة الاصطلاحية لمعالجتها. لدينا عدة حقول تصفية ModelMultipleChoiceFilter للمفاتيح الخارجية لنموذج. أحاول اكتشاف كيفية التصفية حسب سمة فريدة على المفاتيح الخارجية أثناء استخدام عنصر واجهة مستخدم CheckboxSelectMultiple ، دون كشف المفاتيح الأساسية في عناوين URL.

إليك مثال يوضح (أكثر أو أقل) كيف قمت بإعداده الآن.

# 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 ، بينما أريده أن يقرأ /?foo=<prop value> ، لمنع تعريض pk وكذلك جعل عناوين url أكثر قابلية للقراءة.

حاولت تعديل مثل هذه الحقول ، لأنها تعمل في أماكن أخرى في 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 كومينتر

مرحبا. قضية جميلة. سؤال استخدام صارم ، ولكن حسنًا ، من دواعي سروري أن تقرأ.

هل ألقيت نظرة على وسيطة اسم الحقل إلى عوامل التصفية؟
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 التقييمات