2010-07-12 24 views
6

Cách thanh lịch hiệu quả nhất để đặt lại tất cả các trường của một cá thể mô hình nhất định về giá trị mặc định là gì?Django - Cách đặt lại trường mô hình về giá trị mặc định của chúng?

+0

Tôi nghĩ rằng tôi có thể hiểu sai câu hỏi của bạn - bạn muốn đặt từng trường thành giá trị "mặc định" được mã hóa cho từng đối tượng trường trên mô hình - hoặc đặt từng trường trở lại giá trị trước giá trị của trường trường đã được sửa đổi? –

+1

@Matthew - trước đó. Nếu tôi muốn có sau này tôi sẽ bạn django-reversion. – Jonathan

Trả lời

1

Gán None cho các trường và lưu.

+2

Nó sẽ không chỉ hoạt động trong một tập hợp con các tình huống? Ví dụ, nó sẽ làm việc cho các lĩnh vực không được đánh dấu bằng trống = True và null = True? – Jonathan

+1

Chèn cơ sở dữ liệu hoặc cập nhật của NULL được thay đổi thành giá trị mặc định của trường. –

+0

@ Jonathan Tôi khá chắc chắn rằng bạn đã đúng. Tại sao Django thậm chí có trường 'null = True' nếu chúng chỉ trở thành giá trị mặc định? – Mark

0

Sau khi bạn đã thực hiện các thay đổi đối với trường hợp đó nhưng trước khi bạn đã "lưu" nó, tôi giả sử? Tôi nghĩ rằng bạn có thể sẽ cần phải lấy lại nó từ cơ sở dữ liệu ... Tôi không nghĩ rằng trường hợp mô hình Django giữ một "lịch sử" của những thay đổi đã được thực hiện cho một ví dụ.

5

Tôi đã từng làm theo cách này. Không có cách nào tốt hơn tôi có thể nghĩ đến.

from django.db.models.fields import NOT_PROVIDED 

for f in instance._meta.fields: 
    if f.default <> NOT_PROVIDED: 
     setattr(instance, f.name, f.default) 

# treatment of None values, in your words, to handle fields not marked with null=True 
... 
... 
# treatment ends 

instance.save() 

Lưu ý: Trong trường hợp của tôi tất cả các trường, đã có giá trị mặc định.

Hy vọng nó sẽ hữu ích. Happy Coding.

3
def reset(self, fields=[], exclude=[]): 

    fields = fields or filter(lambda x: x.name in fields, self._meta.fields) 
    exclude.append('id')   

    for f in filter(lambda x: x.name not in exclude, fields): 
     if getattr(f, 'auto_now_add', False): 
      continue 

     if f.blank or f.has_default(): 
      setattr(self, f.name, f.get_default()) 
0

Phương pháp này chủ yếu áp dụng để đặt lại một giá trị thành mặc định nhưng có thể điều chỉnh được. Nó đặt lại thuộc tính rego_update cho tất cả các đối tượng Event của tôi.

Event.objects.all().update(rego_update=Event().rego_update) 

Ngoài ra, để áp dụng nó cá nhân (tức là để kích hoạt tùy chỉnh save phương pháp):

default = Event().rego_update # Hack to fetch the default 
for event in Event.objects.all(): 
    event.rego_update = default 
    event.save() 

Để thích ứng này để đặt lại tất cả các giá trị cho một trường hợp duy nhất, bạn có thể tự thiết lập lại các giá trị bằng một mặc định .

Ngoài ra, bạn có thể lặp qua các thuộc tính tương tự với các câu trả lời khác tại đây, nhưng điều này sẽ có vấn đề với các trường không có mặc định (hoặc không thể chỉnh sửa).

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