2016-12-10 6 views
0

У меня есть модели:Django OrderBy с помощью ManyToMany таблицы

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)

  • автомобилей 2 имеют 3 категории (cat2, cat20, cat3)

  • Автомобиль 3 имеет 2 категории (cat4, cat1, cat90)

мне нужно получить: cat1, КАТ2, Cat3, cat4, cat20, cat90 и другие ...

ответ

0

Так у вас есть эта модель:

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

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

В соответствии с этой фразой:

I'd like to get the last 20 categories that had a car of her type added.

сначала мы должны найти автомобиль:

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

Тогда мы должны найти категории:

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

Попробуйте

UPD Когда вы получите все Cars и Category, что вам нужно, вы можете получить в любой категории объекта.

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

В вашем примере 'Restaurant' есть свойство' pizzas', в моем случае 'Category' не имеет свойства' cars'.Глядя на документацию, я не смог найти пример Topping >> Pizza. Просто пицца> Топпинг – Ricardo

+0

Я просто меняю свой ответ, читай его –

+0

Не то ... Я улучшил свой вопрос. Извините за беспорядок. – Ricardo

0

Я использую дополнительную() функцию, чтобы решить эту проблему. См код раздува:

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 заявление, чтобы сделать заказ, результаты по рк через (если не указано Джанго создаст таблицу для вас автоматически) Таблица. Надеюсь, это будет полезно.

Смежные вопросы