【问题标题】:How to get the latest value of one filed(Django Model.objects.filter())如何获取一个字段的最新值(Django Model.objects.filter())
【发布时间】:2018-11-18 05:37:37
【问题描述】:

我的模型如下:

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

非常感谢您的任何建议和帮助。

【问题讨论】:

    标签: django python-3.x filter django-queryset exact-match


    【解决方案1】:

    您可以 order_by('version') 然后获取最新的对象并观察第二个对象是否具有相同的版本。所以你把它和第三个...

    【讨论】:

    • 嗨 Ivan,感谢您的建议,我认为 order_by() 只是一种排序,值也应该显示在页面上。我想根据项目ID显示最新版本,谢谢。
    【解决方案2】:

    试试这个,

    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)
    


    我不确定性能如何,但这肯定会起作用

    【讨论】:

    • 嗨 Jerin,感谢您的建议,我获得了项目的最大值,但它也丢失了一些重要的值,如果它们的版本没有更新,我还需要其他 project_id 的值。再次感谢您的帮助,您对此有什么想法吗?
    • 嗨彼得,我想在模板中使用get_Foo_display,因为project_type是选择,我需要显示project_type的详细信息,我可以使用其他方法选择Max版本,因为我同时不能使用 .values() 和 get_FOO_display ......
    • 我不认为这很容易,反正检查这个SO answer
    • 还是不知道如何在我的项目中使用@property,还是谢谢大家,我只是想在project_type的模板中显示细节,真的没有解决这个问题的更简单方法??
    【解决方案3】:

    或者你可以试试这个:

    from django.db.models import Max
    
    queryset = ProjectRecord.objects.filter(user=self.request.user) \
                                    .values('project_id', 'project_type') \
                                    .annotate(max_version=Max('version')
    

    【讨论】:

    • 你好,我想在模板中使用get_Foo_display,因为project_type是选择,我需要显示project_type的详细信息,我可以使用其他方法选择Max version,因为我不能使用。 values() 和 get_FOO_display 同时......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2021-02-11
    • 2021-11-15
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多