2013-03-31 42 views
22

Tôi đang cố gắng thực hiện một số xác thực tùy chỉnh trên mô hình và tôi bị nhầm lẫn. Hãy để tôi cụ thể. Hãy nói rằng mã của tôi là như sau:Là lưu() được gọi là ngầm khi gọi tạo trong django?

class FooManager(models.Manager): 
    def create_foo(self, name): 
    return self.create(foo_name = name) 

class Foo(models.Model): 
    foo_name = models.CharField(max_length=30) 
    objects = FooManager() 

    def clean(self): 
    ... 
    def save(self, *args, **kwargs): 
    self.full_clean() 
    super(User, self).save(*args, **kwargs) 

Bây giờ, khi tôi đang làm việc với mô hình này từ vỏ, nếu tôi gọi:

f = Foo.objects.create_foo ("")

Nó sẽ nâng cao một lỗi xác nhận trước khi tôi có cơ hội t o gọi save() trên f. Lý do tại sao điều này xảy ra? Không nên lỗi xác thực chỉ được nâng lên khi tôi gọi f.save()?

Lưu ý: điều tương tự cũng xảy ra nếu tôi sử dụng objects.create() trái ngược với phương thức tạo được xác định tùy chỉnh. Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, như tôi đang tìm xác nhận trong django được khá bực bội.

Trả lời

0

Bạn đã quên đặt self trong quản lý của bạn

class FooManager(models.Manager): 
    def create_foo(self, name): 
     return self.create(foo_name = name) 
+0

Không, xin lỗi đó là lỗi của ví dụ kém của tôi. Trong mã thực tế của tôi, tôi tự đặt mình vào người quản lý. Tôi có nên đưa mã thực sự của mình lên, điều đó có giúp ích gì không? – innospark

16

create() sẽ tự động lưu, vì vậy ngay cả khi bạn sửa lỗi của bạn - bạn vẫn sẽ phải đảm bảo các đối số để tạo ra đáp ứng các yêu cầu cơ sở dữ liệu để tiết kiệm ghi lại.

+0

Tại sao tạo tự động lưu? Trong tài liệu, nó nói như sau: "Lưu ý rằng việc tạo mô hình không hề chạm vào cơ sở dữ liệu của bạn; vì vậy, bạn cần phải lưu()." Vì vậy, điểm gọi là tiết kiệm(), nếu tạo() sẽ tự động lưu là gì? – innospark

+2

Đó là toàn bộ vấn đề, bạn không cần phải gọi 'save()' vì 'create()' là một phím tắt để tạo một cá thể, và sau đó lưu nó tự động. –

+0

ohhh, hoàn hảo. Tôi chỉ tìm thấy vị trí trong tài liệu mà nó phác thảo điều này, tôi đoán tôi sẽ cố gắng và đọc khó hơn! Cảm ơn rất nhiều, bạn đã cứu tôi khá nhiều thời gian Burhan! – innospark

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