Django-filter: TypeError: tidak dapat mengasinkan objek odict_items dengan python 3.5

Dibuat pada 14 Nov 2016  ·  7Komentar  ·  Sumber: carltongibson/django-filter

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')

Komentar yang paling membantu

Bagi mereka yang masih mengalami masalah ini, saya menyelesaikannya seperti ini:

list(CATEGORIES.items())

Semua 7 komentar

Hai @dangusev. Reaksi awal adalah bahwa itu tidak masuk akal. Dua pemikiran:

  • Test suite dijalankan terhadap python 3.5, masalah semacam ini akan diambil.
  • 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.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat