2012-11-06 30 views
12

Giả AB là mô hình django, nơi A có một lĩnh vực chính nước ngoài để B:django: giao chìa khóa nước ngoài trước khi mô hình mục tiêu được lưu

a = A() 
b = B() 
a.my_b = b 
b.save() 
a.save() 

Đáng ngạc nhiên a được lưu với null trong my_b lĩnh vực trọng điểm nước ngoài . Nếu bạn kiểm tra a.my_b trước hoặc sau khi lưu, sẽ tham chiếu đến phiên bản b, tuy nhiên có vẻ như django tự đánh giá id khóa ngoài khi chuyển đổi a.my_b = b và không theo a.save(). Trong các hệ thống phức tạp và chảy nó có thể là khó khăn để thay đổi thứ tự các lệnh, vì vậy chỉ đơn giản là tiết kiệm b trước khi gán nó vào a có thể là không thực tế ...

Thêm báo cáo kết quả đáng kinh ngạc a.my_b=a.my_b giữa tiết kiệm lệnh công trình, nhưng dường như với tôi một cách giải quyết khủng khiếp.

Có cách nào để định cấu hình django để đánh giá lại các khóa ngoại khi lưu các trường hợp mô hình không?

Có cách tiếp cận khác có thể giải quyết vấn đề này không?

Trả lời

7

Có vé Django mô tả vấn đề này, #8892.

Trong thời gian chờ đợi, không có cài đặt cấu hình nào thay đổi hành vi. Bạn sẽ phải thay đổi thứ tự các thao tác lưu và gán của bạn hoặc thực hiện nhiệm vụ bổ sung.

+2

Điều này bit cho tôi khi tôi cố gắng tạo động các phiên bản mô hình từ dữ liệu JSON lồng nhau. Trong trường hợp của tôi, tôi không thể lưu các trường hợp trước khi tất cả các trường được xử lý (điều này sẽ dẫn đến các cá thể liên quan được tạo), vì vậy tôi không thể lưu trước khi gán. Thay vào đó, tôi đã xây dựng một danh sách các hàm được gọi khi các cá thể được kết nối. Ngoài phương thức save của mỗi instance, tôi đã thêm một 'partial (setattr, name, value)' để các nhiệm vụ tinh ranh được xếp hàng đợi cho đến khi cá thể liên quan đã được lưu lại. Đáng buồn thay nó không giống như # 8892 sẽ bao giờ được sửa nhưng ít nhất họ sẽ thêm một lỗi. –

+0

@pluma bạn có thể mở rộng giải pháp của mình không? Tôi đang đối phó với cùng một vấn đề. – bryanph

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