2014-09-20 14 views
5

Khi tôi cố gắng chạy manage.py makemigrations trên Django 1,7, tôi nhận được lỗi sau:classmethods Serializing trong Django 1,7

ValueError: Cannot serialize: <bound method ModelBase.get_default of <class 'printapp.models.JobConfiguration'>> 
There are some values Django cannot serialize into migration files. 
For more, see https://docs.djangoproject.com/en/dev/topics/migrations/#migration-serializing 

Vì vậy, nó trông giống như có một vấn đề với phương pháp get_default đó là xác định trên JobConfiguration, có nghĩa là được lặp lại bên dưới:

@classmethod 
def get_default(cls): 
    result = cls() 
    result.save() 
    return result 

Sau link that was provided in the error message, có vẻ như việc tuần tự hóa "tham chiếu lớp" là một tính năng được hỗ trợ.

Có phải là "tham chiếu lớp học" giống như @classmethod không?

Làm cách nào để đặt "tham chiếu lớp" trong "phạm vi cấp cao nhất của mô-đun"?

Tại sao các phương pháp phải được theo dõi bằng cách di chuyển? Tôi đã được giả định rằng di chuyển cho các lược đồ cơ sở dữ liệu, mà chỉ theo dõi các loại dữ liệu được lưu trữ, không phải là loại phương pháp được sử dụng bởi một lớp.

Điều thú vị cần lưu ý là: thay đổi định nghĩa get_default thành phương pháp tĩnh như được lặp lại dưới đây giải quyết được vấn đề, nhưng với chi phí phải mã hóa cứng tên lớp JobConfiguration.

@staticmethod 
def get_default(): 
    result = JobConfiguration() 
    result.save() 
    return result 

(Một số bối cảnh:. Phương pháp này đang được tham chiếu như JobConfiguration.get_default từ bên trong một models.OneToOneField(JobConfiguration, default=JobConfiguration.get_default) với hiệu ứng của việc tạo ra một JobConfiguration mới cho mỗi một trong những lĩnh vực tạo ra)

+1

Chỉ cần quan tâm, điều này cho bạn biết gì hơn 'JobConfiguration.objects.create()'? Nó vẫn là một lệnh, chỉ cần gõ nhiều hơn. –

+0

Huh, tôi đã không nhận ra rằng phương pháp đó đã có sẵn. Tôi có thể sẽ thay đổi nó trong mã của tôi, nhưng tôi vẫn còn quan tâm đến việc biết tại sao mã là không như vậy. – Z1MM32M4N

Trả lời

0

Migrations are just Python files containing the old definitions of your models - thus, to write them, Django must take the current state of your models and serialize them out into a file.

classmethod là ràng buộc để lớp. Kể từ khi trang trí kết thúc tốt đẹp phương pháp, serializer phải đối mặt với một sự mơ hồ những gì để ràng buộc: wrapper hoặc methos, và nó không thành công. Với phương thức tĩnh không có vấn đề như vậy bởi vì nó là một hàm đơn giản gắn liền với lớp.

Các vấn đề liên quan