Tôi đang nâng cấp lên DRF3.1.1 từ 2.4. Tôi đã sử dụng một serializer tùy chỉnh để tạo ra một thể hiện của một đối tượng không phải là một Model.Django Rest Framework 3 Serializers trên các đối tượng không phải Model?
Trong 2,4, thật dễ dàng để làm điều này vì trong bộ nối tiếp, tôi sẽ tạo đối tượng trong restore_object()
. Theo quan điểm, tôi sẽ gọi serializer.is_valid()
và sau đó bật thể hiện của đối tượng ra khỏi bộ nối tiếp với serializer.object
. Sau đó, tôi có thể làm bất cứ điều gì tôi muốn.
Với các thay đổi 3.x, khó có thể loại bỏ đối tượng ra khỏi đối tượng vì phương thức tạo và cập nhật được thực hiện để lưu và "serializer.object" không khả dụng nữa.
Ví dụ, tôi đã từng sử dụng đối tượng này cho đối tượng "UserRegistration" của mình. Đây không phải là một mô hình vì nó là một đối tượng tiện lợi mà máy chủ phân tích và lưu trữ dữ liệu trong một số đối tượng/bảng db khác.
class UserRegistration(object):
def __init__(self, full_name, stage_name, password="", email="", locale="en_US"):
self.full_name = full_name
self.password = password
self.locale = locale
self.email = email
self.stage_name = stage_name
Đây là liên DRF-2.4 serializer:
class UserRegistrationSerializer(serializers.Serializer):
full_name = serializers.CharField(max_length=128, required=False)
stage_name = serializers.CharField(max_length=128)
password = serializers.CharField(max_length=128, required=False)
locale = serializers.CharField(max_length=10, required=False)
# use CharField instead of EmailField for email. We do our own validation later to make for a better error msg.
email = serializers.CharField(max_length=254, required=False)
def restore_object(self, attrs, instance=None):
if instance is not None:
instance.full_name = attrs.get('full_name', instance.full_name)
instance.password = attrs.get('password', instance.password)
instance.locale = attrs.get('locale', instance.locale)
instance.email = attrs.get('email', instance.email)
instance.stage_name = attrs.get('stage_name', instance.stage_name)
return instance
return UserRegistration(**attrs)
Sau đó, trong quan điểm của tôi, tôi làm điều gì đó như thế này:
class UserRegistration(APIView):
throttle_classes =()
serializer_class = UserRegistrationSerializer
def post(self, request, format=None):
event_type = "user_registration"
serializer = UserRegistrationSerializer(data=request.DATA, context={'request': request})
try:
if serializer.is_valid():
user_registration = serializer.object
# save user_registration pieces in various places...
Tuy nhiên, trong DRF3, tôi serializer.object
đã biến mất. Các tài liệu nói để làm "xác nhận" bằng cách sử dụng serializer.validated_data
, nhưng đó chỉ là một băm và không phải là đối tượng thực sự. Có cách nào để lấy vật đó không?
Toàn bộ điều dường như kết hôn với đối tượng DB, trong trường hợp cụ thể này chính xác là những gì tôi đang cố gắng tránh.
Tôi chỉ thiếu một số khái niệm DRF3 mới?
như một người đứng đầu lên bạn không bao giờ nên sử dụng một đường như một giá trị mặc định cho một hàm khi nó trở nên có thể thay đổi và có thể dẫn đến hành vi lạ - http://docs.python-guide.org/en/latest/ viết/gotchas/ – Alvin
@Alvin Những gì bạn đang nói là đúng cho các loại mutable nhưng tôi gần như 100% một số chuỗi python là bất biến. – jackdbernier
Chỉ cần lưu ý nhanh: 'request.DATA' đã không còn được dùng cho 'request.data' kể từ phiên bản 3.0 và đã bị xóa hoàn toàn kể từ phiên bản 3.2. – Slipstream