Tạo nếu không tồn tại


81

Tôi có một ứng dụng Django đọc dữ liệu từ API web và đưa nó vào cơ sở dữ liệu.
Có cách nào để tạo một đối tượng mới từ một chế độ nhưng ngăn ngoại lệ trùng lặp nếu đối tượng đã tồn tại?

Nói cách khác, có cách nào để cứu một đối tượng, nhưng không làm gì nếu nó đã tồn tại?

Câu trả lời:


161

9
làm cho nó trở thành một liên kết đến các tài liệu thêm một số ký tự (và làm cho nó trở thành một câu trả lời tốt hơn mà tôi đoán)
thứ hai

4
Điều này dường như tạo ra 2 truy vấn. Nếu tôi chỉ muốn lưu đối tượng trong trường hợp nó không tồn tại, có cách nào với chỉ 1 truy vấn không? Tôi đoán việc bắt giữ IntegrityErrorkhiến giao dịch hiện tại bị hủy bỏ và không đủ.
Amir Ali Akbari,

bạn có thể bắt lỗi vẹn nếu bạn thêm một savepoint, ví dụ như sử dụng transaction.atomic(đảm bảo bạn nắm bắt bên ngoài các atomickhối, tức là try: with acomic: create; except IntegrityErrorNó cũng khó khăn để đảm bảo bạn không nắm bắt. khác lỗi vẹn hơn một các bạn có ý định
thứ hai

Nếu bạn có thể nắm bắt IntegrityError, thử nghiệm của tôi cho thấy rằng nó cắt giảm thời gian thực hiện gần một nửa khi bản ghi tồn tại so với get_or_create().
Ron


3

Có vẻ như trong các phiên bản Django mới hơn, hàm save () thực hiện UPDATE hoặc INSERT theo mặc định. Xem tại đây .


có vẻ như nó sẽ tự động chọn, tuy nhiên trong db của tôi, nó hiện đang sao chép các mục nhập mỗi khi tôi chạy tập lệnh của mình để điền vào db.
martin-martin

phương thức save () kiểm tra xem PK của mô hình có giá trị hay không. Tác giả sẽ phải truy vấn DB để có được thể hiện mô hình với PK chính xác để sử dụng kỹ thuật này. Việc sử dụng duy nhất của save () không làm được điều kỳ diệu.
chickahoona
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.