Как получить последнее значение одного поля (Django Model.objects.filter ()) - PullRequest
0 голосов
/ 08 июня 2018

У меня есть модели, как показано ниже:

class ProjectRecord(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE, null=True, blank=True,related_name='user_projects')
    project = models.ForeignKey(Project,on_delete=models.CASCADE, null=True, blank=True, related_name='user_projects')
    project_type = models.CharField(max_length=30, choices=(("project_a","A"),("project_b","B")),null=True)
    version = models.FloatField(null=True, blank=True)

Я хочу отфильтровать последнее значение версии следующим образом: project = list(ProjectRecord.objects.filter(user=self.request.user, project_type='project_a')), но я не знаю, как этого добиться. Данные в базе данныхкак показано ниже:

id project_id version project_type
1   5          1.0      project_a
2   5          1.0      project_b
3   4          1.0      project_a
4   4          1.0      project_b
5   5          2.0      project_a          
6   5          2.0      project_b
7   5          3.0      project_a
8   5          3.0      project_b

Например, я хочу получить последнее значение project_id=5 для точного совпадения с другими данными и не удалять значение другого project_id, если их версии не обновляются, набор запросов должен бытьпокажите как показано ниже

id project_id version project_type
1   4          1.0      project_a
2   4          1.0      project_b
3   5          3.0      project_a
4   5          3.0      project_b

Большое спасибо за любые советы и помощь.

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Попробуйте,

from django.db.models import Max

queryset = ProjectRecord.objects.filter(user=self.request.user, project_type='project_a')
max_version = queryset.aggregate(max=Max('version')).get('max')
required_queryset = queryset.filter(version=max_version)


Я не уверен насчет производительности, но это определенно будет работать

0 голосов
/ 09 июня 2018

Или вы можете попробовать это:

from django.db.models import Max

queryset = ProjectRecord.objects.filter(user=self.request.user) \
                                .values('project_id', 'project_type') \
                                .annotate(max_version=Max('version')
0 голосов
/ 08 июня 2018

Вы можете order_by ('version'), а затем взять последний объект и посмотреть, если второй объект имеет ту же версию.так что бери и его в и третий ...

...