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
يسعدني المساهمة في العلاقات العامة أو شرح المزيد حول المواقف التي يمكن أن يؤدي فيها ذلك إلى تسرب المعلومات ، إذا لزم الأمر.
@ 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__'
هو الحد الأدنى.
(عدم فرض تطابق القوائم هو أمر يمكننا العودة إليه).
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
التعليق الأكثر فائدة
راجع للشغل - تمت معالجة تسرب البيانات جزئيًا بواسطة # 451. في الوقت الحالي ، من المفترض أن ترى تحذيرات بشأن الإيقاف حول السلوك غير المحدد / المتغير. في الإصدار 1.0 ، يتمثل السلوك الجديد في أن غياب
Meta.fields
أوMeta.fields = None
لا يفعل شيئًا.