2014-06-15 19 views
16

thể dường như không tìm ra tìm kiếm google ngay cho điều này vì vậy đây nó đi:Django Serializer Phương pháp Dòng

Tôi có một lĩnh vực trong serializer tôi:

likescount = serializers.IntegerField(source='post.count', read_only=True) 

mà tính tất cả các lĩnh vực có liên quan " bài đăng".

Bây giờ tôi muốn sử dụng trường mà như một phần của phương pháp của tôi:

def popularity(self, obj): 
     like = self.likescount 
      time = datetime.datetime.now() 
      return like/time 

Đây có phải là có thể?

+1

nơi là phương pháp thứ hai từ đâu? ('phổ biến'), vậy bạn muốn truy cập dữ liệu ở đâu? –

+0

Ngay bên trong lớp serializer nơi "likescount" là trong @DenisCornehl –

Trả lời

36

giả post.count đang được sử dụng để đo lường số lượt thích trên một bưu chính, bạn không thực sự có ý định chia một số nguyên bởi một dấu thời gian trong phương pháp phổ biến của bạn, sau đó thử này:

sử dụng một SerializerMethodField

likescount = serializers.SerializerMethodField('get_popularity') 

def popularity(self, obj): 
    likes = obj.post.count 
    time = #hours since created 
    return likes/time if time > 0 else likes 

tuy nhiên tôi muốn giới thiệu làm này một tài sản trong mô hình của bạn

trong mô hình của bạn:

@property 
def popularity(self): 
    likes = self.post.count 
    time = #hours since created 
    return likes/time if time > 0 else likes 

sau đó sử dụng một generic Field để tham khảo nó trong serializer của bạn:

class ListingSerializer(serializers.ModelSerializer): 
    ... 
    popularity = serializers.Field(source='popularity') 
+1

Hey tôi thực hiện tương tự, nhưng đã nhận lỗi sau: 'AssertionError tại/api/công thức nấu ăn/2/' ' Field (READ_ONLY = True) nên ReadOnlyField' – Amit

+0

Tùy chọn thứ hai là hợp lệ hoặc tốt hơn nếu trường không phải là chỉ đọc, nó hoạt động với CharField hoặc bất kỳ loại nào nếu nó được biết ... – danigosa

+1

Trong trường hợp thứ hai, vì tên biến và nguồn giống nhau (phổ biến), bạn có được một 'AssertionError' vì sự dư thừa. Trong trường hợp của tôi, tôi đã sử dụng ReadOnlyField, kể từ những gì tôi cần. – guival

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