Django deliciouspie отношения «многие ко многим» - скрытие промежуточных отношений в выводе json

Я только начал использовать Tastypie и пытаюсь понять, как форматировать вывод так, как мне хотелось бы (меня интересуют только методы GET). У меня есть объект викторины, который может иметь несколько вопросов, каждый вопрос может быть в нескольких викторинах (следовательно, многие ко многим, а не один ко многим), но когда кто-то запрашивает объект викторины через API, я хочу только вернуть ( json) массив вопросов, я не хочу/нужно отображать данные таблицы промежуточных отношений.

Некоторый код:

Модели.ру:

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)

и ресурсы.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": "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)

Конечно, может быть более общий способ закодировать это, но пока работает.


person Alex Little    schedule 30.10.2012    source источник


Ответы (1)


Переопределение функции сериализации объекта ресурса вашим собственным кодом было бы хорошим подходом, но рефакторинг пакета данных в методе дегидратации был бы быстрым решением.

person Hedde van der Heide    schedule 30.10.2012
comment
Спасибо - да, пользовательский сериализатор кажется подходящим вариантом. Я обновил свой вопрос с помощью пользовательского сериализатора - person Alex Little; 31.10.2012