Tôi không nghĩ rằng bạn cần trợ giúp để khắc phục sự cố này, vì vậy bạn cần trợ giúp để gỡ lỗi nó. Một khi vấn đề rõ ràng, giải pháp cũng có vẻ rõ ràng. Traceback có lẽ hơi không rõ ràng vì nó sử dụng quá nhiều mã nguồn Django và nó không cho bạn biết trường nào của bạn đang gặp sự cố.
Cơ sở cho vấn đề này
Để bắt đầu, chúng tôi đang gặp sự cố khi lưu Post
ví dụ. Vâng, hãy xem tất cả các trường này mà bạn có trong định nghĩa mô hình của mình:
...
url = models.URLField(max_length=250, blank=True, null=True)
video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True)
content = RichTextUploadingField(config_name='default')
image = models.ImageField(upload_to='images',blank=True, null=True)
thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
Những thứ này có thể không giống các trường văn bản, nhưng rất nhiều trong số chúng là các biến thể trên các trường văn bản bởi vì nếu bạn nghĩ về nó, có thể bạn sẽ không lưu trữ toàn bộ tệp trong cơ sở dữ liệu của bạn. Thay vào đó, những gì bạn sẽ làm (và những gì Django làm theo mặc định) là lưu trữ tệp ở đâu đó trên đĩa nào đó và sau đó trong cơ sở dữ liệu, bạn sẽ lưu trữ đường dẫn vào tệp đó để bạn có thể truy xuất nó khi cần.
Hơn nữa, có thể lãng phí khi lưu trữ đường dẫn tệp trong db dưới dạng LongText
hoặc bất cứ điều gì, vì vậy mọi FileField
chúng tôi có nghĩa là chúng tôi có một trường có max_length
cho dù chúng tôi chỉ định nó hay không. Do đó, tất cả các trường trên đều có max_length
ngầm định . Bạn thực sự có thể tìm ra điều này bằng cách đọc mã nguồn Django.
Ví dụ về nguồn
Tôi chưa bao giờ sử dụng EmbedVideoField
chẳng hạn, nhưng hóa ra là một lớp con của models.URLField
, có nghĩa là nó có max_length
theo mặc định được đặt thành 200 nếu bạn không chỉ định.
Hơn nữa, ImageField
khác nhau của bạn s chỉ là các lớp con của FileField
, có max_length
mặc định là 100
.
Làm cách nào để gỡ lỗi các sự cố như thế này trong tương lai?
Bây giờ, điều này không giúp chúng tôi biết cái nào trong số các trường của bạn đang gặp lỗi trong trường hợp này. Đối với điều đó, tôi có thể sẽ đặt một điểm ngắt ở đâu đó trong mã, có thể là ở đây:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
Bằng cách "đặt điểm ngắt", ý tôi là như sau:
Đi tới dòng 65 trong mô-đun được đề cập ở trên, ebagu/main/models.py
và nhập thông tin sau và lưu mô-đun:import pdb; pdb.set_trace()
(Tôi thực sự rất thích ipdb bản thân tôi, nhưng điều đó đòi hỏi Ipython, mà tôi cũng rất thích ...)
Chạy máy chủ cục bộ của bạn và chạy qua các bước gây ra sự cố này. Cuối cùng, bạn sẽ gửi biểu mẫu của mình và nếu bạn nhìn vào bảng điều khiển nơi bạn khởi động máy chủ của mình, cuối cùng bạn sẽ được đưa vào một trình bao ngay tại dòng 65. Trình bao này là pdb shell
, có các quy tắc khác với shell thông thường, nhưng bạn có thể đánh giá Post
sắp được lưu của mình ví dụ, bằng cách xem xét các trường khác nhau trên chính cá thể đó, self
và chạy mã Python trong ngữ cảnh của cuộc gọi phương thức đó:
(pdb) len(self.image.path)
Bằng cách sử dụng đó, tôi sẽ đánh giá thủ công các trường khác nhau và xem trường nào có mục nhập thực sự dài này đang làm nghẹt quá trình lưu (có thể là một trong các trường ImageField
của bạn s).
Giải pháp có cảnh báo
Ngoài ra, bạn có thể chỉ cần thêm max_length
cho tất cả những điều này, nhưng hãy lưu ý rằng bạn rất có thể sẽ cần thực hiện di chuyển cơ sở dữ liệu đối với bất kỳ trường văn bản giới hạn nào bạn thay đổi vì cơ sở dữ liệu của bạn vẫn sẽ xác minh độ dài của đầu vào so với cách cột được xác định. Đây là một câu trả lời hay cho StackOverflow xem xét chính xác vấn đề này
.
Chú thích cuối trang
Tại sao điều này không xuất hiện trước khi bạn chuyển sang Postgresql? Có nhiều lý do tiềm ẩn, nhưng nó có thể liên quan đến cách thiết lập cơ sở dữ liệu trước đó so với cách thiết lập cơ sở dữ liệu Postgresql (thủ công so với di chuyển Django?).
Nó cũng có thể liên quan đến việc bạn có thay đổi nơi lưu trữ những thứ này hay không. Bạn có thay đổi MEDIA
của mình không cài đặt để các đường dẫn nơi các tệp được lưu trữ lâu hơn rất nhiều?
Những gì bạn thực sự nên làm là xem trực tiếp vào cơ sở dữ liệu của bạn. Mở psql
ví dụ và yêu cầu nó mô tả các bảng của bạn cho bạn. Nó sẽ cho bạn biết những trường nào được giới hạn trong 100 ký tự và đó là những trường gây ra sự cố cho bạn.