Tôi đang đọc về tùy chỉnh nhiều bản cập nhật here và tôi chưa tìm ra phương thức cập nhật tùy chỉnh ListSerializer
. Tôi muốn cập nhật nhiều đối tượng cùng một lúc, tôi không lo lắng về việc tạo nhiều hoặc xóa tại thời điểm này.Cách đăng/đặt dữ liệu json vào ListSerializer
Từ ví dụ trong tài liệu:
# serializers.py
class BookListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# custom update logic
...
class BookSerializer(serializers.Serializer):
...
class Meta:
list_serializer_class = BookListSerializer
Và ViewSet tôi
# api.py
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
Và thiết lập url của tôi sử dụng DefaultRouter
# urls.py
router = routers.DefaultRouter()
router.register(r'Book', BookViewSet)
urlpatterns = patterns('',
url(r'^api/', include(router.urls)),
...
Vì vậy, tôi đã này thiết lập bằng cách sử dụng DefaultRouter
để /api/Book/
sẽ sử dụng BookSerializer
.
Ý tưởng chung là nếu tôi POST/PUT/PATCH một mảng đối tượng JSON thành /api/Book/
thì trình nối tiếp sẽ chuyển sang BookListSerializer
?
Tôi đã thử POST/PUT/PATCH JSON danh sách dữ liệu để /api/Book/
này trông giống như:
[ {id:1,title:thing1}, {id:2, title:thing2} ]
nhưng nó dường như vẫn đối xử với các dữ liệu sử dụng BookSerializer
thay vì BookListSerializer
. Nếu tôi gửi qua POST, tôi nhận được Invalid data. Expected a dictionary, but got list
. và nếu tôi gửi qua PATCH hoặc PUT thì tôi gặp lỗi Method 'PATCH' not allowed
.
Câu hỏi: Tôi có phải điều chỉnh allowed_methods
của DefaultRouter
hoặc BookViewSet
cho phép POST/PATCH/PUT của danh sách? Các chế độ xem chung có được thiết lập để hoạt động với ListSerializer
không?
Tôi biết tôi có thể viết danh sách deserializer của riêng mình cho điều này, nhưng tôi đang cố gắng cập nhật các tính năng mới trong DRF 3 và có vẻ như điều này sẽ hiệu quả nhưng tôi chỉ thiếu một số quy ước hoặc một số Tùy chọn.
Cảm ơn. Sửa lỗi đó. Bây giờ tôi đang gửi một danh sách tới '/ api/Book /'. Nếu tôi gửi qua POST tôi nhận được 'Dữ liệu không hợp lệ. Dự kiến một từ điển, nhưng có danh sách.' và nếu tôi gửi qua PATCH hoặc PUT thì tôi nhận được một 'Phương thức' PATCH 'không được phép.'. Tôi đang sử dụng 'DefaultRouter' và' ModelViewSet' nếu điều đó có ích. – petroleyum
Tôi đã cập nhật câu trả lời để giải quyết câu hỏi của bạn ** chi tiết **. Hy vọng nó bao gồm nhiều phần cho câu hỏi của bạn. Với bất kỳ may mắn nào, gói bên thứ ba sẽ được cập nhật để hỗ trợ 3.0 trong tương lai gần. –
Tuyệt vời, cảm ơn bạn. Tôi đoán câu hỏi của tôi có thể đã được đun sôi xuống "Có vẻ như DRF có một số hành vi cập nhật hàng loạt mặc định hiện tại với 3.0?" và câu trả lời là "Không hoàn toàn." Ví dụ mã của bạn là chính xác những gì tôi cần, tôi sẽ kiểm tra nó ra và cập nhật nếu cần thiết. – petroleyum