2014-11-15 2 views
0

С Django 1.7, используя следующий код на мой взгляд:Джанго связанные _set с order_by показом дублирует

driver = get_object_or_404(Driver, id=self.object.id) 
cars = driver.car_set.order_by('model__market_date') 
for car in cars: # for testing only 
    print car.id # outputs e.g. 3, 3, 3, 5 

Когда я пытаюсь это, я получаю повторяющиеся результаты для автомобилей (например, в два раза автомобиля # 3), в зависимости от количество моделей. Я не хочу этого.

Однако, когда я использую cars = driver.car_set.all(), дублирующих результатов нет. Но я хочу, чтобы мой список автомобилей сортировался по market_date.

Любой указатель на то, как исправить это? Я пробовал с aggregate() и distinct(), но это не исправило ситуацию, к сожалению (или я делаю что-то неправильно).

Мои попытки с distinct():

  • driver.car_set.order_by('model__market_date').distinct() причины дублирует
  • driver.car_set.order_by('model__market_date').distinct('model__market_date') причины дублирует
  • driver.car_set.order_by('model__market_date').distinct('pk') дает Exception Value: SELECT DISTINCT ON expressions must match initial ORDER BY expressions
+0

Я удаляю этот ответ, редактирую ваш вопрос и добавляю, что вы пробовали 'distinct()' – madzohan

+0

Спасибо @madzohan, done. – SaeX

ответ

1

Я не знаю, почему вы получаете дубликаты результатов, потому что не вижу ничего неестественного в вашем коде. В случае, если вы хотите просто получить список автомобилей идентификатора (без дубликатов), вы можете изменить свой для цикла таким образом:

cars_id = []     # creating empty list for cars id with duplicates 
for car in cars:    # for cycle 
    cars_id.append(car.id) # appends numbers 3, 3, 3, 5 to our list 
cars_id = list(set(cars_id)) # making list with unique values using built-in function set() 

Так после того, как вы будете иметь что-то вроде этого:

>>> cars_id 
... [3, 5] 
+0

есть комментарий '# только для тестирования' – madzohan

+0

ОК, удаление дубликатов выполняется с помощью' set() ', например. by 'context ['cars'] = set (cars)'. +1 для обходного пути, но все еще озадачен, почему 'driver.car_set.order_by ('model__market_date'). Distinct()' все еще производит дубликаты! – SaeX

+0

@SaeX, проблема может быть скрыта в базе данных, вы там заглянули? Проверьте дубликаты внутри. – Jacqueminot