こんにちは、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')
こんにちは@dangusev。 最初の反応は、それが意味をなさないということです。 2つの考え:
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
問題は、私のモデルのCharField
にchoices
リストを追加すること
失敗:
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私はこの問題に興味がありますが、このスレッドを爆破したくありません。 この特定のプロジェクトの範囲外の何かかもしれないように聞こえます。 私はあなたにメールを送ります。
最も参考になるコメント
まだこの問題に直面している人のために、私はそれを次のように解決しました: