2014-01-20 3 views
2

나는 세 가지 유형의 물체, 즉 RawArticle, RawPatentRawGrant을 가지고 있습니다.Django REST 프레임 워크 : 다른 serizalized 개체 목록?

기본 클래스가 serializers.ModelSerializer 인 훌륭한 작업 직렬화기를 사용합니다. 내가 RawArticle의 쿼리 집합을 검색하는 경우

나는 many=True와 시리얼 고객에게 직접 전달할 수 있으며, 출력은 공칭 :

이 응답은 다음 코드에서 생성됩니다
[{"save_link": "...", "published": "2014-01-18T20:39:54.086Z", }, {"save_link": "...", "published": "..."}, ...] 

:

return Response(RawArticleSerializer(articles, many=True).data) 

이제 세 개의 다른 개체가 생겼으므로 위의 개체와 마찬가지로 개체를 연결하고 싶습니다.

나는 지금까지 성공적이지 못했다.

all_latest = user_latest(request)['latest_articles'] 

    available_serializers = {RawArticle: RawArticleSerializer, RawGrant: RawGrantSerializer, RawPatent: RawPatentSerializer} 
    serialized = [] 
    for article in all_latest: 
     serialized.append((available_serializers[type(article)](article, many=False)).data) 

    return Response(str(serialized)) 

JSON 및 날짜 시간을 반환하지 않습니다 위의 코드가 실제 날짜로 변환되지 않습니다 : 내 초기 아이디어는 단순히 그 (물론 연재) 등의 직렬화 된 객체의 목록을 작성하고 반환하는 것이 었습니다 시간은 문자열로 표시됩니다.

내 최신 시도는 json.dumps 및 simplejson를 사용했는데 둘 다 말하는 TypeError 인상 :

날짜 시간 객체 직렬화하지 않습니다.

힌트를 주시면 감사하겠습니다.

답변

1

Sunny의 대답은 JSON을 문자열 (큰 따옴표로 묶음)로 반환합니다. 이를 피하기 위해 목록을 반환하면 내가 필요한 것을 수행합니다.

serialized = [] 
    AVAILABLE_SERIALIZERS = {RawArticle: RawArticleSerializer, RawGrant: RawGrantSerializer, RawPatent: RawPatentSerializer} 
    for article in articles: 
     serialized.append((AVAILABLE_SERIALIZERS[type(article)](article, many=False)).data) 

    return Response(serialized) 
2

개인적으로는 serializer를 처리하기 위해 모델에 serialize 메서드를 만듭니다. 이 메서드는 적절한 코드를 호출하여 데이터를 serialize합니다. 메인 코드에서

class RawArticle(models.Model): 
    def serialize(self): 
     return RawArticleSerializer(self, many=False).data 

그런 다음 :이 경우

이 코드는 같을 것이다

객체가 모델이 아니더라도
from rest_framework.renderers import JSONRenderer 

all_latest = user_latest(request)['latest_articles'] 

serialized = [article.serialize() for article in all_latest] 
return Response(JSONRenderer().render(serialized)) 

,이 방법은 여전히 ​​작동합니다.

+0

대단히 고마워요! JSONRendered가 트릭을 수행했습니다. – ChrisR

+0

실제로 이것은 문자열을 반환합니다. .data가 트릭을 한 후에 목록을 반환합니다. 아래에서 내 대답을 설명하겠습니다. – ChrisR

+0

좋은 연습이 부족합니다 : 비즈니스 엔티티에서 직렬화 로그인을 분리하십시오. 나는 접근 방식을 제안했다 :'serialized = all_latest에서 기사를위한 RawArticleSerializer (article, many = False) .data'''RawArticle' 클래스에서'serialize()'메소드를 제거했다. – Rafa0809

관련 문제