Django基于多对多字段的第一个对象进行排序

Posted

技术标签:

【中文标题】Django基于多对多字段的第一个对象进行排序【英文标题】:Django sorting based on first object of many to many field 【发布时间】:2019-04-10 15:39:03 【问题描述】:

在这里,我想根据汽车字段的第一个对象对用户进行排序。对于外键,我正在这样做,这就是我尝试过的。 User.objects.all().order_by('car__name')。 但是对于多对多的领域,我如何才能为第一个或最后一个对象做到这一点。

class Car(models.Model):
  name = models.CharField(max_length=40)

class User(models.Model):
   name = models.CharField(max_length=40)
   car = models.ManyToManyField(Car)

【问题讨论】:

那么第一个或最后一个对象是什么?在数据库中,项目是无序的,因此没有第一个/最后一个相关对象之类的东西。 【参考方案1】:

您可以将注解与子查询一起使用来实现您想要的,如下:

cars = Car.objects.filter(user=OuterRef('pk')).order_by('some_ordering')
user = User.objects.annotate(first_car_name=Subquery(cars.values('name')[1])).order_by('first_car_name')

更多信息可以在这里找到:https://docs.djangoproject.com/en/2.1/ref/models/expressions/#subquery-expressions

【讨论】:

以上是关于Django基于多对多字段的第一个对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

Django:在创建对象时搜索多对多字段

Django 查询集过滤具有相同多对多字段的对象

Django如何过滤多对多字段中的对象,而不是原始查询集

Django Unhashable Type List 即使我传入一个对象?(多对多字段)

Django - 查询列表中的任何项目在多对多字段中的任何对象

Django:对象需要具有字段“...”的值才能使用这种多对多关系