2015-04-29 2 views
1

Следующий код используется для определения порядка объектов по мере их отправки в JSON. Он также позволяет подключать jquery datatables к тому, чтобы установить, в каком столбце устанавливается порядок, и если его восходящий или нисходящий. Это отлично подходит для упорядочивания объектов по умолчанию, но что, если я хочу заказать объект на основе связанного поля? Как мне это сделать?Django как заказать объект на основе связанного с ним поля

objects = StoreLiquor.objects.filter(storeID=store_id) 
keys = ['SPI', 'liquorID'] 

#sorting 
order = dict(enumerate(keys)) 
dirs = {'asc': '', 'desc': '-'} 
ordering = dirs[request.GET['sSortDir_0']] + order[int(request.GET['iSortCol_0'])] 
objects = objects.order_by(ordering) 

С помощью этого кода, это будет своего рода просто отлично на основе liquourID, который является внешним ключом. Но как я могу заставить его сортировать по алфавиту на основе BrandName, поля в таблице, которое liquourID ссылок?

ответ

0

Так что я смог разобраться в этом сам, как это сделать. Я не уверен, что это лучшее решение, но выполнение операций if и then действительно работает. поскольку enumerate(keys) присваивает целое число каждому ключу в keys, и запрос на отсортированный столбец, который будет отсортирован, также возвращает int, я установил его для изменения этого порядка на основе того, является ли его восходящий или нисходящий, и если был нажат второй столбец.

#sorting 
order = dict(enumerate(keys)) 
direction = request.GET['sSortDir_0'] 
column = request.GET['iSortCol_0'] 
dirs = {'asc': '', 'desc': '-'} 
if direction == 'asc' and column == '1': 
    ordering = dirs[direction] + order[int(column)] 
    objects = objects.order_by('liquorID__BrandName') 
elif direction == 'desc' and column == '1': 
    ordering = dirs[direction] + order[int(column)] 
    objects = objects.order_by('-liquorID__BrandName') 
else: 
    ordering = dirs[direction] + order[int(column)] 
    objects = objects.order_by(ordering) 
0

Вы можете использовать тот же стиль синтаксиса, что и с filter, чтобы запрашивать отношения.

например.

objects = objects.order_by('tablename__BrandName') 

Где tablename это имя поля внешнего ключа.

От Django doc:

Чтобы заказать полем в другой модели, используйте тот же синтаксис, когда вы запрашиваете по модели отношений. То есть, имя поля , за которым следует двойное подчеркивание (__), за которым следует имя поле в новой модели и т. Д. Для того, чтобы столько моделей, сколько вы хотите, .

Редактировать в ответ на комментарий от OP:

На основе вашего ответа, который вы хотите сортировать и выбранный столбец в DataTablesиBrandName, я думаю, что вы хотите передать как в качестве аргументов order_by (который принимает несколько аргументов к порядку последовательных столбцов в SQL):

objects = objects.order_by(ordering, 'tablename__BrandName') 

Или измените аргументы, в зависимости от того, какой столбец вы хотите иметь приоритет.

+0

Я уже пробовал это, он ничего не меняет для сортировки в таблице, поскольку он все еще ищет только поле ликвора и ищет его. – RuSs

+0

Как выглядит сгенерированный запрос после изменения 'order_by'? Вызовите 'print' на' objects.query', и вы увидите результат в терминале, на котором запущен 'runningerver'. Что делать, если вы также добавляете дополнительный FK в 'filter', а затем также вызываете' select_related'? – khampson

+0

Если я установил order_by, как у вас есть, в разделе сортировки, то он будет сортироваться по названию бренда.Тем не менее, он разрушает все функциональные возможности, предоставляемые кодом, например, позволяет сортировать в обратном порядке или разрешать их сортировку различными объектами. – RuSs

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