在为一个方法编写测试用例时,我发现如果我使用 my_queryset.first().my_annotated_value 与使用 my_queryset.last().my_annotated_value 时会得到不同的结果,尽管 my_queryset.count() 返回 1。
这是相关的代码片段:
class ShopManager(models.Manager):
def get_best_matches(self, customer):
shops = super(ShopManager, self).get_queryset().filter(employees__matches__customer=customer).annotate(max_match_percentage=Coalesce(Max('employees__matches__match_value'), 0)).order_by('-max_match_percentage')
for shop in shops:
shop.max_match_percentage = float(shop.max_match_percentage) * 100.0
return shops
在我运行的外壳中:
shops = Shop.objects.get_best_matches(customer=Customer_A)
shops.count() # returns 1
shops.first().max_match_percentage # returns 73.9843
shops.last().max_match_percentage # returns Decimal('0.739843')
我有不同的 django 应用程序用于shops
,matches
和.employees
customers
我搜索了几个小时并检查了 django 文档中 first() 和 last() 的实现。我找不到任何解释这种行为的东西。
为什么价值观不同,到底发生了什么?我做错了什么还是这是一个错误?