4

Tastypieを使い始めたばかりで、出力を希望どおりにフォーマットする方法を模索しています(GETメソッドにのみ興味があります)。複数の質問を持つ可能性のあるクイズオブジェクトがあり、各質問は複数のクイズに含まれる可能性があります(したがって、1対多ではなく多対多)-しかし、誰かがAPIを介してクイズオブジェクトを要求した場合、( 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": [
    {
      "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"
}

ただし、私が本当に望んでいるのは、この形式の出力です。これは、すべての中間テーブルID/順序フィールドに次の情報を表示する必要がないためです。

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

これを達成する方法はありますか?ヘルプ/ポインタは大歓迎です。

更新:このようなカスタムシリアライザーを使用すると、機能するようです:

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)

確かに、これをコーディングするためのより一般的な方法があるかもしれませんが、今のところは機能します。

4

1 に答える 1

3

リソースオブジェクトのシリアル化関数を独自のコードでオーバーライドすることは良いアプローチですが、dehydrateメソッド内でデータバンドルをリファクタリングすることは簡単な修正です。

于 2012-10-30T22:43:35.107 に答える