Halo, saya menemukan kesalahan selama instantiasi kelas turunan FilterSet di python>=3.5. Dalam 3.4 semuanya bekerja dengan baik.
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
Contoh kelas FilterSet saya. Bidang DateTimeFIlter dan CommaSeparatedCharFilter adalah khusus:
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')
Hai @dangusev. Reaksi awal adalah bahwa itu tidak masuk akal. Dua pemikiran:
base_filters
seharusnya OrderedDict
, bukan odict_items
. Apakah ada yang mengesampingkan base_filters
?Maaf, saya buruk). Saya punya banyak kode seperti ini:
category = ChoiceField(choices=CATEGORIES.items())
Ketika copy.deepcopy() dipanggil pada self.base_fields ia mencoba untuk memilih bidang dan gagal, karena pilihan memiliki tipe dict_items.
Bagi mereka yang masih mengalami masalah ini, saya menyelesaikannya seperti ini:
list(CATEGORIES.items())
[Dengan Python 3.85 dan Django 3.1.1] Demikian pula, saya mendapatkan kesalahan ini di salah satu tampilan daftar saya:
TypeError: cannot pickle 'dict_items' object
Tidak ada di backtrace dalam kode saya:
https://pastebin.com/S4xn8zpT
Ternyata masalahnya adalah menambahkan daftar choices
ke CharField
dalam model saya:
gagal:
record_request_status = models.CharField(max_length=4, null=True, choices=RECORD_REQUEST_STATUS)
bekerja dengan baik:
record_request_status = models.CharField(max_length=4, null=True)
RECORD_REQUEST_STATUS
adalah dikte:
with open('case-manager/src/json_fixtures/record_request_status.json') as json_file:
RECORD_REQUEST_STATUS = json.load(json_file).items()
Menetapkan daftar choices
ke CharField
s lain dalam model berfungsi dengan baik.
Menetapkan daftar choices
ke record_request_status
juga gagal.
ini bekerja:
record_request_status = models.CharField(max_length=4, null=True, choices=list(RECORD_REQUEST_STATUS))
Dapatkah seseorang menjelaskan apa yang terjadi?
@paulschreiber dalam situasi Anda RECORD_REQUEST_STATUS
mengembalikan tipe dict_items
alih-alih hanya Daftar atau Tuple primitif.. dict_items
bukan tipe yang dikenal untuk acar untuk dikonversi sehingga melempar kesalahan itu . dict_items
memiliki metode yang tepat yang diterapkan untuk dihitung sebagai iterator sehingga metode list
bekerja dalam mengonversinya dan dengan demikian pilihan akhirnya dapat menerima apa yang Anda lewati.
Mudah-mudahan, itu menjelaskannya dalam bentuk yang baik, sudah beberapa tahun sejak terakhir kali saya melihat ini.
@ Ryanb58 Saya tidak mengerti mengapa itu gagal hanya untuk bidang ini, tetapi berfungsi untuk semua bidang lain di berbagai model saya. Dalam setiap kasus, saya membaca dalam file JSON yang merupakan kamus.
@paulschreiber Saya tertarik dengan masalahnya tetapi juga tidak ingin meledakkan utas ini. Kedengarannya seperti itu mungkin sesuatu di luar lingkup proyek khusus ini. Aku akan menembakmu email.
Komentar yang paling membantu
Bagi mereka yang masih mengalami masalah ini, saya menyelesaikannya seperti ini: