2013-11-20 17 views
6

Tôi muốn serialise một mô hình với rất nhiều lựa chọn như ví dụ:serialise lựa chọn văn bản cho IntegerField với lựa chọn

class House(models.Model): 
ACCESSIBILITY_CHOICES = (
    (ACCESSIBILITY_FULL, 'Full'), 
    (ACCESSIBILITY_PARTIAL, 'Partial'), 
    (ACCESSIBILITY_NONE, 'None') 
) 

accessibility = models.IntegerField(max_length=1, choices=ACCESSIBILITY_CHOICES, null=True) 

Tôi yêu rằng serializer mặc định như:

class HouseView(generics.ListCreateAPIView): 
    model = House 
    serializer_class = HouseSerializer 

class HouseSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = House 

công trình tuyệt vời nếu tôi chỉ muốn giá trị số nguyên

{accessibility:1} 

Tuy nhiên, tôi muốn nhận được

{accessibility:'Full'} 

Trợ giúp được đánh giá cao. Rất cám ơn.

Trả lời

1

Set những lựa chọn trong lĩnh vực serializer với các giá trị nguyên như vậy ...

ACCESSIBILITY_CHOICES = (
    ('Full', 'Full'), 
    ('Partial', 'Partial'), 
    ('None', 'None') 
) 

Sau đó, hãy xem trọng phương pháp 'to_native' để các giá trị chuỗi được dịch sang các khoản tương đương số nguyên của họ.

Điều đó sẽ cung cấp cho bạn API bên ngoài sử dụng các biểu diễn chuỗi, nhưng một phần phụ trợ sử dụng các biểu diễn số nguyên.

+0

Ok, tuyệt. Cảm ơn vì đã chú ý giùm thứ này. Tốt tôi đã kiểm tra không có một giải pháp khai báo để ghi đè lên to_native. –

6

Bạn có thể nhận được trường chỉ đọc bộ nối tiếp chỉ đọc với giá trị tiết của trường mô hình với các lựa chọn thông qua phương thức get_FOO_display. Phương thức này được thêm tự động khi thiết lập các lựa chọn trên một trường. Bạn có thể đặt phương thức đó làm nguồn cho trường ký tự.

Đối với các điểm cuối cũng hỗ trợ ghi dữ liệu, tôi khuyên bạn nên thêm trường "bình thường" và một trường chỉ đọc khác có phần mở rộng là _name.

Trong ví dụ của bạn, điều sau đây sẽ tạo ra kết quả bạn đang tìm kiếm. Các accessibility_name là chỉ-đọc, trong khi accessibility là có cho phép ghi/cập nhật các giá trị.

class HouseSerializer(serializers.ModelSerializer): 

    accessibility_name = serializers.CharField(source='get_accessibility_display') 

    class Meta: 
     model = House 
     fields = ('accessibility', 'accessibility_name',) 
Các vấn đề liên quan