答案 0 :(得分:7)
使用双下划线语法。
User.objects.order_by('-pet__age')[:10]
修改强>
要获得Tom的十个朋友,您可以获取实例并过滤:
User.objects.get(name='Tom').friends.order_by('-pet__age')[:10]
或者如果你已经有汤姆:
tom.friends.order_by('-pet__age')[:10]
答案 1 :(得分:0)
试试这个: 首先在模型用户中定义 unicode ,如下所示: 这样,用户模型对象将始终返回用户记录的名称字段。
class User(models.Model):
name = models.CharField(max_length=50, null=False, blank=False)
friends = models.ManyToManyField(self, ...)
def __unicode__(self):
return self.name
然后使用此查询:
User.objects.filter(friends='Tom').order_by('-pet__age')[:10]
答案 2 :(得分:0)
另一种解决方案(order_by
的替代方案)是使用nlargest
模块的heapq
函数,如果您已经有friends
列表,这可能会更好(tom' s在这种情况下的朋友)有大量的项目(我的意思是从绩效的角度来看)。
import heapq
heapq.nlargest(
10,
User.objects.get(name='Tom').friends.all(),
key=lambda f: f.pet.age
)
注意:您还可以使用nsmallest
功能来获取最年幼的宠物。