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