Django-filter: TypeError:python 3.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μž…λ‹ˆλ‹€. 초기 λ°˜μ‘μ€ 말이 μ•ˆλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 두 가지 생각:

  • ν…ŒμŠ€νŠΈ μŠ€μœ„νŠΈλŠ” 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

λ‚΄ μ½”λ“œμ—λŠ” μ—­μΆ”μ μ˜ 아무 것도 μ—†μŠ΅λ‹ˆλ‹€.
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 λŠ” κΈ°λ³Έ List λ˜λŠ” Tuple λŒ€μ‹  dict_items μœ ν˜•μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€. dict_items λŠ” λ³€ν™˜ν•  피클에 λŒ€ν•΄ μ•Œλ €μ§„ μœ ν˜•μ΄ μ•„λ‹ˆλ―€λ‘œ ν•΄λ‹Ή 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. . dict_items μ—λŠ” 반볡자둜 κ³„μ‚°ν•˜κΈ° μœ„ν•΄ κ΅¬ν˜„λœ μ μ ˆν•œ λ©”μ„œλ“œκ°€ μžˆμœΌλ―€λ‘œ list λ©”μ„œλ“œκ°€ λ³€ν™˜μ— μž‘λ™ν•˜λ―€λ‘œ 선택 ν•­λͺ©μ΄ μ „λ‹¬ν•˜λŠ” 것을 λ§ˆμΉ¨λ‚΄ 받아듀일 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°”λΌκ±΄λŒ€, 그것이 쒋은 ν˜•νƒœλ‘œ μ„€λͺ…λ©λ‹ˆλ‹€. λ‚΄κ°€ 이것을 λ§ˆμ§€λ§‰μœΌλ‘œ λ³Έ 지 λͺ‡ 년이 μ§€λ‚¬μŠ΅λ‹ˆλ‹€.

@Ryanb58 이 ν•„λ“œμ—μ„œλ§Œ μ‹€νŒ¨ν•˜λŠ” 이유λ₯Ό μ΄ν•΄ν•˜μ§€

@paulschreiber λ¬Έμ œμ— 관심이 μžˆμ§€λ§Œ 이 μŠ€λ ˆλ“œλ₯Ό ν­νŒŒν•˜κ³  싢지도 μ•ŠμŠ΅λ‹ˆλ‹€. 이 νŠΉμ • ν”„λ‘œμ νŠΈμ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ 것 κ°™μŠ΅λ‹ˆλ‹€. 이메일을 λ³΄λ‚΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰