Django-filter: TypeError: لا يمكن التقاط كائنات odict_items في بيثون 3.5

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

مرحبًا ، لقد اكتشفت خطأ أثناء إنشاء مثيل لفئة مشتقة من 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')

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

بالنسبة لأولئك الذين ما زالوا يواجهون هذه المشكلة ، قمت بحلها كما يلي:

list(CATEGORIES.items())

ال 7 كومينتر

مرحباdangusev. رد الفعل الأولي هو أنه لا معنى له. فكرتان:

  • تم تشغيل مجموعة الاختبار ضد Python 3.5 ، وكان من الممكن حل هذا النوع من المشكلات.
  • يجب أن يكون 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 أنا مهتم بالمشكلة ولكني أيضًا لا أريد تفجير هذا الموضوع. يبدو أنه قد يكون شيئًا خارج نطاق هذا المشروع المحدد. سأرسل لك بريدًا إلكترونيًا.

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

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

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

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

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

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

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