Я просмотрел документацию Тастипи и искал какое-то время, но, похоже, не могу найти ответ на этот вопрос.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? Или есть лучший способ сделать то, что я пытаюсь достичь?