2010-07-22 36 views
22

Tôi đang ghi dữ liệu di chuyển ở miền nam để sửa một số dữ liệu không chuẩn hóa mà tôi đã sửa đổi trong mã trước đó. Cách để tìm ra giá trị đúng cho trường không chính xác là gọi một phương thức tĩnh trên lớp mô hình django. Mã này trông như thế này:Cách gọi một phương thức tĩnh trên một lớp mô hình django trong khi di chuyển về phía nam

class Account(models.Model): 
    name = models.CharField() 

    @staticmethod 
    def lookup_by_name(name): 
     # There's actually more to it than this 
     return Account.objects.get(name=name) 

class Record(models.Model): 
    account_name = models.CharField() 
    acct = models.ForeignKey('Account') 

...

class Migration(DataMigration): 

    def forwards(self, orm): 
     # Fixing Records with the wrong FK to Account 
     for record in orm.Record.objects.all(): 
      record.acct = orm.Account.lookup_by_name(record.account_name) 
      record.save() 

Nhưng điều này không thành công với

AttributeError: type object 'Account' has no attribute 'lookup_by_name'

Tôi đoán nam chỉ không hỗ trợ @staticmethod s trên mô hình các lớp học?

Cố nhập tài khoản trực tiếp không thành công, trừ khi tôi cũng nhập Ghi trực tiếp và hoàn toàn bỏ qua đối tượng ORM. Đó có phải là một lựa chọn an toàn, vì đó là di chuyển dữ liệu và lược đồ không thay đổi? Hoặc tôi nên chạy bản vá này bằng tay chứ không phải trong bối cảnh di cư về phía nam.

Trả lời

36

Bạn không thể sử dụng các phương thức từ models.py trong di chuyển về phía nam. Lý do là trong tương lai models.py sẽ phát triển và sớm hay muộn bạn sẽ xóa các phương thức đó, sau đó di chuyển sẽ bị hỏng.

Bạn nên đặt tất cả mã cần thiết bằng cách di chuyển trong tệp di chuyển.

+3

Huh. Điểm tốt. Cảm ơn. – Leopd

+0

thx, Nghe có vẻ như là một lý do tốt, nhưng một số lần nó thực sự rất nhiều đau đớn vì không được phép sử dụng nó. Có lẽ phải có một số cài đặt có thể thay đổi là hành vi và nhà phát triển chịu trách nhiệm giữ phương thức ở đó trong các phiên bản sau của mã, nếu anh ta/cô ấy bật nó lên. –

1

Bạn không sử dụng các tên khác nhau lookup_by_namelookup_name?

+0

Cám ơn bắt typo trong câu hỏi của tôi. Đó không phải là vấn đề với mã thực sự của tôi. – Leopd

+0

Tôi đã gửi một yêu cầu thay đổi nhỏ để sửa lỗi đánh máy này trong câu hỏi gốc. Tôi đã duyệt câu hỏi này bởi vì tôi đã có một vấn đề tương tự và bị phân tâm bởi câu trả lời đơn giản. –

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