2012-05-02 31 views

Trả lời

3

Các mô hình điển hình là để làm một cái gì đó như:

model = Model.objects.get(pk=2342) 
dirty = False 
if foo: 
    model.foo = 'bar' 
    dirty = True 
if bar: 
    model.bar = 'baz' 
    dirty = True 

if dirty: 
    model.save() 
0

Django thực hiện kiểm tra nội bộ này. Truy vấn sql sẽ không được kích hoạt trừ khi mô hình thực sự đã thay đổi.

CẬP NHẬT

Câu trả lời này là sai. Lỗi của tôi. Tôi đã nhầm lẫn điều này với một thứ khác.

+0

+1. Để lại kiểm tra đó để Django trừ khi bạn có lý do rất hấp dẫn để làm như vậy. –

+3

Tôi không nghĩ vậy. Bạn có thể cung cấp một số bằng chứng? Hoặc có bạn trộn nó lên w/'has_changed' kiểm tra các hình thức Django? – okm

+4

Tôi cũng không nghĩ vậy. Bạn có thể hiển thị trên dòng nào kiểm tra này được xử lý [ở đây] (https://code.djangoproject.com/browser/django/trunk/django/db/models/base.py#L467)? – DrTyrsa

1

Chỉ cần phân biệt trường hợp 'ảnh chụp nhanh' với trường thể hiện mô hình hiện tại theo trường, bạn có thể nhận được snapshot thông qua copy.copy(obj) hoặc model_cls.objects.get(pk=obj.pk).

Ngoài ra bạn chỉ có thể so sánh các phiên bản đổ:

from django.core.serializers.json import Serializer 
dump = Serializer.serialize([obj]) 
... 
changed = dump == Serializer.serialize([obj]) 

Thông thường, tinh chỉnh mã của bạn là đơn giản nhất:

obj = Model.objects.get(pk=2342) # 'obj' is better than 'model', IMO 
changed = False 
if foo: 
    ... 
    obj.foo = 'bar' 
    changed = True 
if bar: 
    ... 
    obj.bar = 'baz' 
    changed = True 
if changed: 
    obj.save()  
Các vấn đề liên quan