2015-10-08 19 views
5

Chỉ cần tham gia vào khung công tác Django Rest.Bao gồm giá trị get_absolute_url trong đầu ra JSON

Tôi có một ví dụ đơn giản đang chạy nơi mô hình được trình bày qua REST API. Không có trường liên quan trong mô hình, chỉ là một chuỗi các chuỗi.

Cách dễ nhất để trình bày giá trị get_absolute_url() của mô hình đó vào đầu ra JSON là gì?

Tôi đang sử dụng serializers.HyperlinkedModelSerializer để chuẩn bị chuyển sang các mô hình phức tạp hơn có các trường liên quan.

+0

Tôi tìm thấy rất nhiều câu trả lời trong [bài đăng liên quan] này (http://stackoverflow.com/questions/18396547/django-rest-framework-adding-additional-field-to-modelserializer) – SimonMorris

Trả lời

6

Approach-1 Sử dụng một SerializerMethodField:

Bạn có thể sử dụng một SerializerMethodField trong serializer của bạn để thêm giá trị get_absolute_url() để đại diện tuần tự của đối tượng.

Theo SerializerMethodField docs:

Đây là một trường chỉ đọc. Nó nhận giá trị của nó bằng cách gọi một phương thức trên lớp serializer nó được gắn vào. Nó có thể được sử dụng để thêm bất kỳ dữ liệu nào vào đại diện được tuần tự hóa của đối tượng của bạn.

Chúng tôi sẽ xác định một phương pháp get_my_abslute_url() cho my_absolute_url trường trong serializer của chúng tôi mà sẽ thêm url tuyệt đối của đối tượng để các đại diện tuần tự.

class MyModelSerializer(serializers.ModelSerializer): 

    my_absolute_url = serializers.SerializerMethodField() # define a SerializerMethodField   

    def get_my_absolute_url(self, obj): 
     return obj.get_absolute_url() # return the absolute url of the object 

Approach-2 Sử dụng URLField với source luận:

Bạn cũng có thể sử dụng một URLField và vượt qua các phương pháp get_absolute_url với nó. Điều này sẽ gọi phương thức get_absolute_url và trả về giá trị đó trong đại diện được tuần tự hóa.

Từ docs DRF trên source argument:

Tên của thuộc tính sẽ được sử dụng để cư lĩnh vực này. May là một phương pháp mà chỉ mất một self argument, chẳng hạn như URLField('get_absolute_url'), hoặc có thể sử dụng ký hiệu chấm đi qua thuộc tính, chẳng hạn như EmailField(source='user.email').

class MyModelSerializer(serializers.ModelSerializer): 

    my_absolute_url = serializers.URLField(source='get_absolute_url', read_only=True) 

tôi sẽ đề nghị sử dụng phương pháp thứ 2 như DRF đã dùng đầy ý nghĩa này trong tài liệu của nó.

+0

Câu trả lời hay - cảm ơn rất nhiều – SimonMorris

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