Есть модель:
class FirstModel(Model):
...
class SecondModel(Model):
first_model= ForeignKey(FirstModel, related_name = 'second_model')
user = ForeignKey(User, related_name = 'second_model')
is_exist = NullBooleanField()
timestamp = DateTimeField()
Нужно пользователю вывести список FirstModel'ов на которые ссылаются SecondModel'ы, в которых user равен этому пользователю, причём отсортировать этот список надо по timestamp'ам самых последних SecondModel'ов ссылающихся на пользователя и данный FirstModel, плюс в этом списке вывести ещё количество SecondModel'ов соответствующих этому FirstModel'у со значениеми is_exist соответственно True/None/False.
Т.е. в итоге должен получиться список:
fm1 (10, 453, 12)
fm2 (650, 413, 7)
fm3 (153, 74, 89)
fm4 (132, 951, 82)
…
где fmN - это FirstModel, три цифры в скобках соответственно сколько SecondModel'ов ссылающихся на этот fm имют значение is_exist соответственно True/None/False.
Причём стоит отметить, что на один FirstModel ссылаются достаточно много SecondModel'ов (сотни), поэтому очень желательно сделать обработку минимальным количеством запросов. Плюс при отображении используется пагинация, т.е. за раз будет отображаться только 10-20 FirstModel'ов.
Писать сырые запросы очень бы не хотелось.
Для формирования списка без сортировки конечно можно использовать:
FirstModel.objects.filter(second_model__user = user).distinct()
Но если мы попробуем записать вот так, то понятно что оно будет выдавать дублирующие результаты:
FirstModel.objects.filter(second_model__user = user).order_by('-second_model__timestamp').distinct()
Соответственно из-за сортировки мы не можем использовать distinct().
Есть ли у вас идеи как решать данную задачу? Буду благодарен за любую помощь.
Отредактировано (Янв. 15, 2011 23:39:45)