2012-02-23 33 views
10

Tôi muốn thực hiện thêm sự bực bội bất cứ khi nào các trường hợp của một mô hình django cụ thể được tạo. Tôi biết rằng overriding __init__ can lead to trouble. Tôi nên cân nhắc lựa chọn nào khác?Thêm vào "hàm tạo" của một mô hình django

Cập nhật. Chi tiết bổ sung: Mục đích là để khởi tạo một máy trạng thái mà các cá thể của mô hình đó đại diện. Máy trạng thái này được cung cấp bởi một thư viện được nhập khẩu, và trạng thái bên trong của nó được duy trì bởi mô hình django của tôi. Ý tưởng là bất cứ khi nào mô hình được tải, máy trạng thái sẽ được tự động khởi tạo với dữ liệu của mô hình.

+0

Bạn đã hiểu sai câu hỏi đó. Nó không phải là ghi đè '__init__' không hoạt động, OP chỉ làm tất cả sai. Bạn được tự do ghi đè '__init__', nhưng hiệu quả của điều đó hoàn toàn phụ thuộc vào chính xác bạn đang cố gắng làm gì. Vậy tại sao bạn không nói với chúng tôi rằng, vì vậy chúng tôi thực sự có thể giúp bạn. –

+0

Cảm ơn, tôi đã đọc lại chuỗi khác. Bạn có nghĩa là, nếu tôi giữ chữ ký '' '(tự, * args, ** kwargs)' '', ghi đè \ _ \ _ init \ _ \ _ sẽ không nhận được trên cách django? –

+0

Tôi đã thêm một số thông tin khác vào câu hỏi để làm rõ mục đích. –

Trả lời

14

Ghi đè __init__ có thể hoạt động, nhưng đó là ý tưởng tồi và đó không phải là cách Django.

Cách thích hợp để thực hiện việc đó ở Django đang sử dụng signals.

Thứ bạn quan tâm nhất trong trường hợp này là pre_initpost_init.

django.db.models.signals.pre_init

Bất cứ khi nào bạn khởi tạo một mô hình Django , tín hiệu này được gửi vào lúc bắt đầu của phương pháp của mô hình __init__() .

django.db.models.signals.post_init

Giống như pre_init, nhưng điều này sẽ được gửi khi __init__(): Phương pháp kết thúc

Vì vậy, mã của bạn nên được một cái gì đó giống như

from django.db import models 
from django.db.models.signals import post_init 

class MyModel(models.Model): 
    # normal model definition... 

def extraInitForMyModel(**kwargs): 
    instance = kwargs.get('instance') 
    do_whatever_you_need_with(instance) 

post_init.connect(extraInitForMyModel, MyModel) 

Bạn cũng có thể kết nối tín hiệu để mô hình được xác định trước của Django.

+0

Theo cách nào thì ý tưởng xấu là ghi đè '__init__'? Nó trình bày không có vấn đề nhiều hơn trong django hơn trong bất kỳ tình huống khác. – Marcin

+7

vartec Tôi biết nó đã được một thời gian, nhưng tôi chỉ va vào trả lời của bạn và tôi tò mò. Tại sao bạn nói rằng tín hiệu là cách Django? Tại sao không phải một trong hai cách được mô tả trong tài liệu Django để giải quyết tình huống chính xác này? https://docs.djangoproject.com/en/1.4/ref/models/instances/#django.db.models.Model Cảm ơn – oneloop

+2

Liên kết được cập nhật từ nhận xét trước là: https: //docs.djangoproject. com/en/1.9/ref/models/instances / –

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