Django OrderBy使用ManyToMany表

时间:2016-12-10 16:52:57

标签: django django-queryset

我有模特:

class Category(models.Model):
    description = models.CharField(unique=True, max_length=200)                        

class Car(models.Model):
    categorys = models.ManyToManyField(Category)      

不断增加新车。

我希望获得最后20个类别的车型。

我必须设置一个过滤器,但是当我按顺序排序时,我再也无法得到它。

由于我无法关闭任何逻辑,所以我不会把我在这里尝试过的东西。

更新

我添加3辆汽车:

  • 汽车1有2个类别(cat1和cat2)

  • Car 2有3个类别(cat2,cat20,cat3)

  • Car 3有2个类别(cat4,cat1,cat90)

我需要得到: cat1,cat2,cat3,cat4,cat20,cat90等......

2 个答案:

答案 0 :(得分:0)

所以你有这个模型:

class Category(models.Model):
    description = models.CharField(unique=True, max_length=200)                        

class Car(models.Model):
    categorys = models.ManyToManyField(Category)      

根据这句话:

  

我想得到最后20个类别的汽车   加入。

起初我们必须找到这辆车:

car = Car.objects.get("""your parameters""")

然后我们必须找到类别:

category = car.category_set.all()[:20]

试试这个

<强> UPD 当您获得所需的所有CarsCategory时,您可以访问任何类别对象。

categories = Cars.objects.filter("""your filter""").select_related('categorys')
for category in categories.categorys_set():
  print(category.description)

答案 1 :(得分:0)

我使用 extra()函数来解决问题。 见代码打击:

class School(models.Model):
  ...
  tag = models.ManyToManyField(Tag)

  def tags(self):
    meta = self.tag.through._meta
    db_table = meta.db_table
    primary_key = meta.pk.name
    order_by = [db_table + '.' + primary_key]
    return list(self.tag.extra(order_by=order_by).values_list('name', flat=True))

通过顺序添加到sql语句,按

通过(如果未指定django会自动为您创建一个表)生成结果顺序表。 希望这会有所帮助。