获取属于其OneToOne模型的属性排序的模型

时间:2016-10-17 06:24:10

标签: python django python-3.x

让我们说有一个名为User的模型和另一个名为Pet的模型,它与User有一个OneToOne关系,Pet模型有一个属性年龄,如何获得拥有十大最老狗的十个用户? class User(models.Model):      name = models.CharField(max_length = 50,null = False,blank = False) class Pet(models.Model):      name = models.CharField(max_length = 50,null = False,blank = False)      owner = models.OneToOneField(User,on_delete = models.CASCADE)      age = models.IntegerField(null = False) 在用户中,有一个属性朋友与User有一个ManyToMany关系,如何获得拥有十大最老狗的用户Tom的十个朋友? class User(models.Model):      name = models.CharField(max_length = 50,null = False,blank = False)      friends = models.ManyToManyField(self,...) class Pet(models.Model):      name = models.CharField(max_length = 50,null = False,blank = False)      owner = models.OneToOneField(User,on_delete = models.CASCADE)      age = models.IntegerField(null = False)

3 个答案:

答案 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功能来获取最年幼的宠物。