2012-10-30 3 views
4

방금 ​​Tastypie를 사용하기 시작했고 출력 형식을 지정하는 방법을 알아 내려고 노력하고 있습니다 (GET 메서드에만 관심이 있습니다). 여러 개의 질문을 가질 수있는 퀴즈 개체가 있습니다. 각 질문은 여러 퀴즈에있을 수 있습니다 (따라서 하나에서 여러 개가 아닌 여러 개로 이루어집니다).하지만 누군가가 API를 통해 퀴즈 개체를 요청하면 (json) 배열을 사용하여 중간 관계 테이블 데이터를 표시하고 싶지는 않습니다.장고 tastypie 많은 관계 - json 출력의 중간 관계 숨기기

일부 코드 :

Models.py :

class Question(models.Model): 
    owner = models.ForeignKey(User) 
    created_date = models.DateTimeField('date created',default=datetime.now) 
    lastupdated_date = models.DateTimeField('date updated',default=datetime.now) 
    title = models.CharField(max_length=500) 
    def __unicode__(self): 
     return self.title 

class Quiz(models.Model): 
    owner = models.ForeignKey(User) 
    created_date = models.DateTimeField('date created',default=datetime.now) 
    lastupdated_date = models.DateTimeField('date updated',default=datetime.now) 
    title = models.CharField(max_length=200) 
    description = models.TextField(blank=True) 
    props = models.TextField(blank=True) 
    questions = models.ManyToManyField(Question, through='QuizQuestion') 

    def __unicode__(self): 
     return self.title 


class QuizQuestion(models.Model): 
    quiz = models.ForeignKey(Quiz) 
    question = models.ForeignKey(Question) 
    order = models.IntegerField(default=1) 

및 resources.py :

class QuizResource(ModelResource): 
    q = fields.ToManyField('mquiz.api.resources.QuizQuestionResource', 'quizquestion_set', related_name='quiz', full=True) 
    class Meta: 
     queryset = Quiz.objects.all() 
     allowed_methods = ['get'] 
     fields = ['title', 'id'] 
     resource_name = 'quiz' 
     include_resource_uri = False 

class QuizQuestionResource(ModelResource): 
    question = fields.ToOneField('mquiz.api.resources.QuestionResource', 'question', full=True) 
    class Meta: 
     queryset = QuizQuestion.objects.all() 
     allowed_methods = ['get'] 
     include_resource_uri = False 

class QuestionResource(ModelResource): 
    class Meta: 
     queryset = Question.objects.all() 
     allowed_methods = ['get'] 
     fields = ['title'] 
     resource_name = 'question' 
     include_resource_uri = False 

충분히이 작동하지만 확실히 내가했던 출력을 제공하지 않습니다 처럼.

{ 
    "id": "1", 
    "q": [ 
    { 
     "title": "What is the capital of Latvia?" 
    }, 
    { 
     "title": "What is the capital of Ethiopia?" 
    } 
    ], 
    "title": "Capitals" 
} 
: 나는 모든 중간 테이블 ID/주문 필드는 표시가 필요하지 않기 때문에, 그러나

{ 
    "id": "1", 
    "q": [ 
    { 
     "id": "1", 
     "order": 1, 
     "question": { 
     "title": "What is the capital of Latvia?" 
     } 
    }, 
    { 
     "id": "2", 
     "order": 2, 
     "question": { 
     "title": "What is the capital of Ethiopia?" 
     } 
    } 
    ], 
    "title": "Capitals" 
} 

, 나는이 형식의 출력처럼 정말 것이 무엇 : 그것은 나에게 출력을 제공

이것을 달성 할 방법이 있습니까? 어떤 도움/포인터 많이 감사합니다.

UPDATE :이 같은 사용자 정의 시리얼 라이저를 사용하여이 작동하는 것 같다 :

class QuizJSONSerializer(Serializer): 
    json_indent = 2 

    def to_json(self, data, options=None): 
     options = options or {} 
     data = self.to_simple(data, options) 
     for question in data['q']: 
      del question['id'] 
      del question['order'] 
      for qkey, qvalue in question['question'].items(): 
       question[qkey] = qvalue 
      del question['question'] 
     return simplejson.dumps(data, cls=json.DjangoJSONEncoder, 
       sort_keys=True, ensure_ascii=False, indent=self.json_indent) 

물론이 코드에 더 일반적인 방법이있을 수 있습니다 -하지만 지금은 작동합니다. 자신의 코드와 자원 객체의 직렬화 기능을 재정의

답변

3

좋은 방법이 될 것입니다,하지만 탈수 방법 내의 데이터 번들을 리팩토링하는 빠른 수정을

+0

감사합니다 것 - 예 사용자 정의 시리얼 갈 방법을 보인다 . 내 질문을 사용자 지정 serializer로 업데이트했습니다. –