Django-filter: رفع استثناء إذا لم يتم إعطاء الحقول في FilterSet

تم إنشاؤها على ٢٨ سبتمبر ٢٠١٦  ·  11تعليقات  ·  مصدر: carltongibson/django-filter

class BooksFilter(filters.FilterSet):
    class Meta:
        model = Books

عند حذف الخيار fields في فئة عوامل التصفية (على النحو الوارد أعلاه) ، سيتم تضمين جميع حقول النموذج في مجموعة المرشحات. قد يؤدي ذلك إلى تسرب المعلومات عند استخدامه مع DRF ، حيث يتم تقديم النموذج في واجهة برمجة التطبيقات القابلة للتصفح.

يتطلب كل من Django و DRF تحديد الحقول بشكل صريح في النماذج / المتسلسلات بسبب مشكلات الأمان المحتملة. يجب أن يكون هذا مطلوبًا في مرشحات django-filter أيضًا.
http://www.django-rest-framework.org/api-guide/serializers/#specifying -which -field-to-include
https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#selecting-the -field-to-use

يسعدني المساهمة في العلاقات العامة أو شرح المزيد حول المواقف التي يمكن أن يؤدي فيها ذلك إلى تسرب المعلومات ، إذا لزم الأمر.

ImprovemenFeature

التعليق الأكثر فائدة

راجع للشغل - تمت معالجة تسرب البيانات جزئيًا بواسطة # 451. في الوقت الحالي ، من المفترض أن ترى تحذيرات بشأن الإيقاف حول السلوك غير المحدد / المتغير. في الإصدار 1.0 ، يتمثل السلوك الجديد في أن غياب Meta.fields أو Meta.fields = None لا يفعل شيئًا.

ال 11 كومينتر

@ nip3o نعم. سعيد لرؤية هذا.

أود أيضًا أن تطلب الحقول عوامل تصفية معلنة ، وفقًا لـ DRF ، أثناء تواجدك فيه ... 😉

راجع للشغل - تمت معالجة تسرب البيانات جزئيًا بواسطة # 451. في الوقت الحالي ، من المفترض أن ترى تحذيرات بشأن الإيقاف حول السلوك غير المحدد / المتغير. في الإصدار 1.0 ، يتمثل السلوك الجديد في أن غياب Meta.fields أو Meta.fields = None لا يفعل شيئًا.

أود أيضًا أن تطلب الحقول عوامل تصفية معلنة ، وفقًا لـ DRF ، أثناء تواجدك فيه

لست متأكدًا من كيفية عمل ذلك مع بناء الجملة لـ Meta.fields . على سبيل المثال:

class UserFilter(filters.FilterSet):
    username = filters.CharFilter()

    class Meta:
        model = User
        fields = {
            'name': ['contains', 'startswith', 'endswith', ...'],
            ???
        }

لست متأكدًا من كيفية عمل هذا مع بناء الجملة الخاص بالديكت

في الواقع.

ما زلت نوعًا من: -1: حول هذا. لا أرى طريقة لحل بناء الجملة Meta.fields ict مع عوامل التصفية المعلنة. على الأقل ، ليس بطريقة غير محرجة:

class UserFilter(filters.FilterSet):
    username = filters.CharFilter(name='username', lookup_expr='exact')
    username_like = filters.CharFilter(name='username', lookup_expr='icontains')
    relevance = filters.CharFilter(method='filter_relevance')

    class Meta:
        model = User
        fields = {
            'name': ['contains', 'startswith', 'endswith', ...'],
            'username': ['exact'],  # match w/ the lookup_expr? 
            'username_like': ['icontains'],
            'relevance': [???]  # What about method filters?
        }

بالإضافة إلى ذلك ، يواجه هذا المطلب مشكلات لحقول النماذج المخصصة التي لا ترث فئة حقل موجودة في FilterSet.FILTER_DEFAULTS . قد تتطلب الحقول المخصصة ما يلي:

class NetworkSettingFilter(FilterSet):
    mask = MaskFilter(...)

    class Meta:
        model = NetworkSetting
        fields = ['mask']
        filter_overrides = {
            SubnetMaskField: {'filter_class': MaskFilter},
        }

# vs.

class NetworkSettingFilter(FilterSet):
    mask = MaskFilter(...)

    class Meta:
        model = NetworkSetting

ملاحظة جانبية: هذه النقطة اللاحقة شيء يمكننا إصلاحه. سيتعين علينا إعادة كتابة التوليد التلقائي للتصرف مثل المسلسلات DRF بدلاً من نماذج نماذج Django. في كلتا الحالتين ، شاغلي الرئيسي هو الصراع النحوي.

نعم. دعنا نتركه الآن.

أنا أحب الاقتراح الأصلي. أنا أميل إلى توسيع نطاقها إلى _إذا كان fields قائمة ..._ لكني بحاجة إلى التفكير في الأمر أكثر من ذلك بقليل.

قليلًا من التأخير ولكنني سأعيد تحديد هذا الأمر من أجل الإصدار الأصلي فقط .

يجب التصريح إما fields أو exclude . يجب أن يكون fields = '__all__' هو الحد الأدنى.

(عدم فرض تطابق القوائم هو أمر يمكننا العودة إليه).

رمز DRF ذي الصلة موجود هنا :

        assert not (fields is None and exclude is None), (
            "Creating a ModelSerializer without either the 'fields' attribute "
            "or the 'exclude' attribute has been deprecated since 3.3.0, "
            "and is now disallowed. Add an explicit fields = '__all__' to the "
            "{serializer_class} serializer.".format(
                serializer_class=self.__class__.__name__
            ),
        )

نحتاج إلى إضافة مماثلة في filters_for_model :

    # Setting exclude with no fields implies all other fields.
    if exclude is not None and fields is None:
        fields = ALL_FIELDS

يجب أن يتم إهماله للبدء.

يجب التصريح إما fields أو exclude . يجب أن يكون fields = '__all__' هو الحد الأدنى.

يمكنني بالتأكيد الحصول على وراء ذلك. تعمل حاليا على العلاقات العامة.

بارد.

بالتفكير ، لا تقلق بشأن الاستهلاك. إنه تغيير صغير ، على تغيير رئيسي في الإصدار. فقط تأكد من تسميته في ملاحظات التغيير. 👍🏽

بالتفكير ، لا تقلق بشأن الاستهلاك. إنه تغيير صغير ، على تغيير رئيسي في الإصدار. فقط تأكد من تسميته في ملاحظات التغيير.

النية مختلفة قليلاً ، لكننا في الواقع قمنا بتغطية هذا نوعًا ما هنا .

أيضًا ، يتم حاليًا إعادة هيكلة filters_for_model لعدم محاولة إنشاء عامل تصفية للفلاتر المُعلنة. (هذا متعلق بمثال الشبكة الفرعية / القناع حيث يؤدي fields = ['mask'] إلى استثناء غير ضروري.

مغلق برقم 550

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

madelyneriksen picture madelyneriksen  ·  4تعليقات

loganknecht picture loganknecht  ·  4تعليقات

csarcom picture csarcom  ·  3تعليقات

GuillaumeCisco picture GuillaumeCisco  ·  3تعليقات

edmorley picture edmorley  ·  3تعليقات