2012-12-27 2 views
1

Я просмотрел документацию Тастипи и искал какое-то время, но, похоже, не могу найти ответ на этот вопрос.Tastypie: включить вычисленное поле из родственной модели?

Предположим, что у нас есть две модели: Student и Assignment, с отношением «один ко многим» между ними. Модель Assignment включает в себя поле assignment_date. В принципе, я хотел бы построить API с помощью Tastypie, который возвращает Student объекты , отсортированные по дате последнего назначения. Независимо от того, выполняется ли сортировка на сервере или на стороне клиента, неважно, но везде, где выполняется сортировка, необходимо сортировать assignment_date.

Идея № 1: просто вернуть задания вместе со студентами.

class StudentResource(ModelResource): 
    assignments = fields.OneToManyField(
     AssignmentResource, 'assignments', full=True) 

    class Meta: 
     queryset = models.Student.objects.all() 
     resource_name = 'student' 

К сожалению, каждый студент может иметь десятки или сотни заданий, поэтому это раздуто и не нужно.

Идея № 2: увеличение данных в течение цикла дегидратации.

class StudentResource(ModelResource):  
    class Meta: 
     queryset = models.Student.objects.all() 
     resource_name = 'student' 

    def dehydrate(self, bundle): 
     bundle.data['last_assignment_date'] = (models.Assignment 
      .filter(student=bundle.data['id']) 
      .order_by('assignment_date')[0].assignment_date) 

Это не идеальный вариант, так как он будет выполнять отдельную базу данных для каждой записи студента. Это также не очень декларативный, не элегантный.

Итак, есть ли хороший способ получить такую ​​функциональность с Tastypie? Или есть лучший способ сделать то, что я пытаюсь достичь?

ответ