Django-filter: TypeError:Python3.5でodict_itemsオブジェクトを選択できません

作成日 2016年11月14日  ·  7コメント  ·  ソース: carltongibson/django-filter

こんにちは、python> = 3.5でFilterSetから派生したクラスのインスタンス化中にエラーが発生しました。 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。 最初の反応は、それが意味をなさないということです。 2つの考え:

  • テストスイートはPython3.5に対して実行され、この種の問題が検出されたはずです。
  • base_filtersは、 OrderedDictではなく、 odict_itemsます。 base_filtersオーバーライドするものはありますか?

すみません、私の悪いです)。 私はこのようなコードをたくさん持っています:

category = ChoiceField(choices=CATEGORIES.items())

copy.deepcopy()がself.base_fieldsで呼び出されると、フィールドの選択肢を選択しようとして失敗します。これは、選択肢のタイプがdict_itemsであるためです。

まだこの問題に直面している人のために、私はそれを次のように解決しました:

list(CATEGORIES.items())

[Python3.85およびDjango3.1.1の場合]同様に、リストビューの1つで次のエラーが発生します。

TypeError: cannot pickle 'dict_items' object

私のコードにはバックトレースには何もありません:
https://pastebin.com/S4xn8zpT

問題は、私のモデルのCharFieldchoicesリストを追加すること

失敗:

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割り当てると、問題なく機能します。
他の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タイプを返します。 dict_itemsは、変換するpickleの既知のタイプではないため、エラーをスローします。 。 dict_itemsは、イテレータとしてカウントするための適切なメソッドが実装されているため、 listメソッドはそれを変換する際に機能し、選択は最終的に渡されたものを受け入れることができます。

うまくいけば、それはそれを良い形で説明します、私がこれを最後に見たのは数年前です。

@ Ryanb58なぜこのフィールドだけで失敗するのかわかりませんが、さまざまなモデルの他のすべてのフィールドで機能します。 いずれの場合も、辞書であるJSONファイルを読み込んでいます。

@paulschreiber私はこの問題に興味がありますが、このスレッドを爆破したくありません。 この特定のプロジェクトの範囲外の何かかもしれないように聞こえます。 私はあなたにメールを送ります。

このページは役に立ちましたか?
0 / 5 - 0 評価