Создайте список объектов с уникальным FK и самой последней отметкой времени, используя Django - PullRequest
0 голосов
/ 28 февраля 2012

Я хочу создать список объектов Task, который является самой последней записью задачи для каждого клиента. Затем используйте этот список, чтобы создать список словарей (с указанием клиента, некоторых значений задачи и даты) для каждого объекта в списке задач. У меня есть модель, которая выглядит следующим образом:

class Client(models.Model):
    user_name = models.CharField

class Task(models.Model):
    client = models.ForeignKey('Client',)
    task_type = models.ForeignKey('Task_Type',)
    timestamp = models.DateTimeField(default = datetime.now(), blank = True, null = True,)

class Task_Type(models.Model):
    name = models.CharField(
                        max_length = namelen,
                        unique = True,
                        )

class Task_Value(models.Model):
    value_char = models.TextField
    task = models.ForeignKey('Task',)
    field = models.ForeignKey('Task_Field')  

Моя попытка это выглядела примерно так:

task_objs=Task.objects.filter(client__in=client_list, task_type=1).distinct().order_by('-timestamp')
task_dict = [{task_obj[x].client.pk:task_obj[x].task_value_set.get(field__name__exact='ABC').value_char} for x in range (0,len(client_list),1)]  

Но это дает мне отдельные записи для каждой комбинации клиента и метки времени (поэтому все записи). Итак, два вопроса, как получить отдельную запись для каждого клиента, которая является самой последней записью для клиента? и во-вторых, есть ли лучший способ для получения task_dict, чем я описал?

Ответы [ 2 ]

1 голос
/ 05 марта 2012

См. вопрос .Я предлагаю первый ответ, пользовательский метод (2-й ответ) добавит большую нагрузку на БД для больших наборов запросов.

0 голосов
/ 13 марта 2012

Использование предложения AgDude для охвата отношений со значениями. Я перемещаю свой запрос на один шаг назад и запрашиваю модель Tasxk_Value, фильтруя задачи, охватывая отношения в команде фильтра. Затем охватывая отношения с values_list.

Если выполняется следующее: queryset.value_list ('pk', 'task__timestamp'), другой queryset.values_list ('pk', 'task__client') и другой queryset.values_list ('pk', 'value_char') , Затем с помощью dict () каждый из списков значений преобразуется в словари, которые можно использовать для анализа нужных значений.

В тех случаях, когда требуются только самый последний клиент и value_char, все, что требуется, - это один values_list ('task__client', 'value_char') и dict (). Однако набор запросов должен быть упорядочен от самого старого до самого нового, поскольку итерации записывают ранее сохраненные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...