Sau khi nghiên cứu mã, có vẻ như có một số loại lỗi khi tham chiếu đến lần nhập đó. Tôi đã xem xét tệp /lib/python3.2/site-packages/django/utils/six.py và tìm thấy vị trí tham chiếu đến mô-đun move.zip_longest.
Đầu tiên là tham chiếu này:
moves = sys.modules[__name__ + ".moves"] = _MovedItems(__name__ + ".moves")
Có nghĩa là nó đang gọi lớp _MovedItems và ở đây nó có tham chiếu đến mô-đun của tôi đã bị hỏng.
class _MovedItems(_LazyModule):
"""Lazy loading of moved objects"""
_moved_attributes = [
MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest")
class MovedAttribute(_LazyDescr):
def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
super(MovedAttribute, self).__init__(name)
if PY3:
if new_mod is None:
new_mod = name
self.mod = new_mod
if new_attr is None:
if old_attr is None:
new_attr = name
else:
new_attr = old_attr
self.attr = new_attr
Sau đó kế thừa từ lớp _LazyDescr, nhưng đó là một đối tượng nhỏ ngắn. Tôi không biết mọi thứ đã sai ở đâu, nếu bạn ánh xạ bộ tuple được chuyển vào phương thức khởi tạo MovedAttribute, nó sẽ ánh xạ chính xác phiên bản cũ sang phiên bản mới. Tôi không chắc tại sao nó không thành công nhưng nếu bạn xóa câu lệnh nhập trong tệp compiler.py và chỉ cần gọi trực tiếp itertools zip_longest, thì tất cả đều hoạt động.
Đây là những gì nó trông như thế nào. Nếu bạn đang sử dụng Python 3, hãy chỉnh sửa tệp /lib/python3.2/site-packages/mysql/connector/django/compiler.py và thay đổi dòng 6 từ tệp này:
from django.utils.six.moves import zip_longest as six_zip_longest
về điều này:
from itertools import zip_longest