2011-03-02 38 views
5

Tôi có một mô hình mà tôi đã ghi đè phương thức lưu để phương thức lưu có thể được chuyển vào một số dữ liệu và tự động điền vào một trường trước khi lưu. Đây là mô hình của tôi:ghi đè Django Nhận hoặc Tạo

class AccountModel(models.Model): 

    account = models.ForeignKey(Account) 

    def save(self, request=None, *args, **kwargs): 
     if request: 
      self.account = request.session['account'] 
     super(AccountModel, self).save(*args, **kwargs) 

    class Meta: 
     abstract = True 

Ý tưởng là tôi thiết lập một mô hình cơ sở cho các đối tượng mà cần phải được liên kết với một tài khoản và sau đó tôi sẽ không phải đối phó với các kết nối tài khoản mỗi khi họ đưa ra (đó là rất nhiều). Nhưng tôi cũng muốn sử dụng get_or_create, để lưu các đối tượng mới mà không cần phải chuyển yêu cầu. Tôi biết nó là doable để không sử dụng get_or_create và làm một thử/ngoại trừ thay vào đó, nhưng tôi muốn biết nếu có một cách để ghi đè get_or_create và cách thích hợp để làm điều đó là gì.

Tôi đã xem mã cho Trình quản lý (mà tôi đang xem ghi đè) và hàm get_or_create chỉ gọi hàm get_or_create của QuerySet. Có lẽ tôi có thể viết nó để sử dụng các chức năng quản lý khác và không phải là phiên bản QuerySet của get_or_create? Bạn nghĩ sao?

Trả lời

4

Bạn có thể phân lớp django.db.models.query.QuerySet và ghi đè lên các phương pháp get_or_create đó để chấp nhận lập luận từ khóa request của bạn và vượt qua nó vào save tôi đoán, nhưng nó không phải là rất đẹp.

class AccountQuerySet(models.query.QuerySet): 
    def get_or_create(...): 
     ... 

Sau đó, bạn có thể thêm người quản lý tùy chỉnh để mô hình Account của bạn mà sử dụng tùy chỉnh này QuerySet:

class AccountManager(models.Manager): 
    def get_query_set(self): 
     return AccountQuerySet(self.model) 

Sau đó sử dụng quản lý này trong mô hình của bạn:

class Account(models.Model): 
    ... 
    objects = AccountManager() 

Nhưng bạn có thể tìm thấy rằng phương pháp try-except là neater sau khi tất cả :)

+0

Điều này đã giúp tôi khi tôi cần ghi đè bulk_create(). Cảm ơn! – Chad

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