مرحبًا ، لقد اكتشفت خطأ أثناء إنشاء مثيل لفئة مشتقة من FilterSet في python> = 3.5. في 3.4 كل شيء يعمل بشكل جيد.
File "/home/dan/venvs/notes3.5/lib/python3.5/site-packages/django_filters/filterset.py" in __init__
291. self.filters = copy.deepcopy(self.base_filters)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in deepcopy
182. y = _reconstruct(x, rv, 1, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in _reconstruct
320. value = deepcopy(value, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in deepcopy
182. y = _reconstruct(x, rv, 1, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in _reconstruct
297. state = deepcopy(state, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in deepcopy
155. y = copier(x, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in _deepcopy_dict
243. y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in deepcopy
155. y = copier(x, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in _deepcopy_dict
243. y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/home/dan/venvs/notes3.5/lib/python3.5/copy.py" in deepcopy
174. rv = reductor(4)
Exception Type: TypeError at /notes/
Exception Value: can't pickle odict_items objects
مثال على فئة FilterSet الخاصة بي. الحقول DateTimeFIlter و CommaSeparatedCharFilter مخصصة:
class NoteListFilterset(django_filters.FilterSet):
strict = STRICTNESS.RAISE_VALIDATION_ERROR
keywords = CommaSeparatedCharFilter(name='keyword', lookup_expr='in')
datetime_from = DateTimeFilter(name='datetime', lookup_expr='gte')
datetime_to = DateTimeFilter(name='datetime', lookup_expr='lte')
get_hidden = django_filters.MethodFilter(method='filter_by_get_hidden')
مرحباdangusev. رد الفعل الأولي هو أنه لا معنى له. فكرتان:
base_filters
OrderedDict
، وليس odict_items
. هل هناك شيء يتجاوز base_filters
؟اسف هذا خطأي). لدي الكثير من التعليمات البرمجية مثل هذا:
category = ChoiceField(choices=CATEGORIES.items())
عندما يتم استدعاء copy.deepcopy () على self.base_fields ، فإنه يحاول انتقاء اختيارات الحقول ويفشل ، لأن الاختيارات لها نوع Dict_items.
بالنسبة لأولئك الذين ما زالوا يواجهون هذه المشكلة ، قمت بحلها كما يلي:
list(CATEGORIES.items())
[مع Python 3.85 و Django 3.1.1] وبالمثل ، فإنني أتلقى هذا الخطأ في إحدى طرق عرض القائمة الخاصة بي:
TypeError: cannot pickle 'dict_items' object
لا شيء في backtrace موجود في الكود الخاص بي:
https://pastebin.com/S4xn8zpT
تبين أن المشكلة كانت إضافة قائمة choices
إلى CharField
في النموذج الخاص بي:
فشل:
record_request_status = models.CharField(max_length=4, null=True, choices=RECORD_REQUEST_STATUS)
يعمل بشكل جيد:
record_request_status = models.CharField(max_length=4, null=True)
RECORD_REQUEST_STATUS
هو إملاء:
with open('case-manager/src/json_fixtures/record_request_status.json') as json_file:
RECORD_REQUEST_STATUS = json.load(json_file).items()
تعيين نفس القائمة choices
إلى أخرى CharField
s في النموذج يعمل بشكل جيد.
فشل أيضًا تعيين قوائم choices
إلى record_request_status
.
هذا يعمل:
record_request_status = models.CharField(max_length=4, null=True, choices=list(RECORD_REQUEST_STATUS))
هل يستطيع أحد أن يشرح ما يحدث؟
paulschreiber في RECORD_REQUEST_STATUS
نوع dict_items
بدلاً من مجرد قائمة أولية أو Tuple .. dict_items
ليس نوعًا معروفًا للتحويل من المخلل ، لذا فهو يلقي بهذا الخطأ . dict_items
على الأساليب المناسبة التي يتم تنفيذها لحساب مكرر ، لذا فإن طريقة list
تعمل في تحويلها ، وبالتالي يمكن أن تقبل الخيارات أخيرًا ما تقوم بتمريره.
آمل أن يفسر ذلك الأمر بشكل جيد ، لقد مرت بضع سنوات منذ آخر مرة نظرت فيها.
@ Ryanb58 لا أفهم سبب فشلها في هذا المجال فقط ، ولكنها تعمل مع جميع المجالات الأخرى في
paulschreiber أنا مهتم بالمشكلة ولكني أيضًا لا أريد تفجير هذا الموضوع. يبدو أنه قد يكون شيئًا خارج نطاق هذا المشروع المحدد. سأرسل لك بريدًا إلكترونيًا.
التعليق الأكثر فائدة
بالنسبة لأولئك الذين ما زالوا يواجهون هذه المشكلة ، قمت بحلها كما يلي: