Tôi có API REST khung thời gian còn lại của django với tài nguyên phân cấp. Tôi muốn để có thể tạo subobjects bằng cách POSTing để /v1/objects/<pk>/subobjects/
và có nó tự động thiết lập các khóa nước ngoài trên subobject mới để pk
kwarg từ URL mà không cần phải đặt nó trong tải trọng. Hiện tại, serializer đang gây ra lỗi 400, bởi vì nó mong đợi khóa ngoài object
nằm trong tải trọng, nhưng nó cũng không được coi là tùy chọn. URL của các subobject là /v1/subobjects/<pk>/
(vì khóa của phụ huynh không cần thiết để xác định nó), vì vậy nó vẫn còn cần thiết nếu tôi muốn PUT
một tài nguyên hiện có.Django REST Framework: tạo các đối tượng phân cấp bằng cách sử dụng đối số URL
Tôi có nên tạo nó để bạn đăng lên /v1/subobjects/
với phụ huynh trong tải trọng để thêm các subobject, hoặc có cách nào tốt để chuyển số pk
kwarg từ URL tới bộ nối tiếp không? Tôi đang sử dụng HyperlinkedModelSerializer
và ModelViewSet
làm các lớp cơ sở tương ứng của mình. Có cách nào được khuyến nghị thực hiện việc này không? Cho đến nay ý tưởng duy nhất tôi có là hoàn toàn thực hiện lại ViewSets và tạo một lớp Serializer tùy chỉnh có get_default_fields() xuất phát từ một từ điển được truyền vào từ ViewSet, được điền bởi các kwargs của nó. Điều này có vẻ khá liên quan đến một cái gì đó mà tôi đã có thể nghĩ là hoàn toàn chạy-of-the-mill, vì vậy tôi không thể không nghĩ rằng tôi đang thiếu một cái gì đó. Mỗi API REST mà tôi từng thấy có các điểm cuối có thể ghi được đều có kiểu suy luận đối số dựa trên URL này, vì vậy thực tế là khung công tác django-rest-dường như không thể làm điều đó có vẻ lạ.
'pre_save' không được gọi cho đến sau khi deserialization, tại thời điểm đó nó đã ném một lỗi xác nhận. –
Ah, được rồi. Đã cập nhật câu trả lời. –
Đó là một lựa chọn và sẽ làm việc cho một cái gì đó như bình luận, nhưng một số các đối tượng tôi có thể được reparented, do đó, thiết lập các phụ huynh một cách rõ ràng trong một PUT sẽ được tốt đẹp quá. Mặt khác, tôi có thể làm theo cách này và sau đó có một hành động POST 'reparent' rõ ràng hoặc một cái gì đó, nhưng điều đó dường như một chút ít RESTful. Tôi sẽ chấp nhận câu trả lời này vì đó là một ý tưởng hay và sẽ làm việc cho đa số trường hợp. –