Набор запросов в действиях администратора django всегда пуст

#django #django-admin

#джанго #django-администратор

Вопрос:

Я написал действие, которое должно обновлять поле в каждой записи, выбранной пользователем, в соответствии с этим документом.
Проблема в том, что queryset он всегда пуст, и, таким образом, никаких изменений не происходит.

 def SendCommandAction(self, request, queryset):
   
    print(self._Command)
    commandStatus = {
                'Command':self._Command,
                'Fetched':False
            }
    print(queryset) #output from console: <QuerySet []>
    updated = queryset.update(Command_Status = commandStatus,)
    
    self.message_user(request, ngettext(
        '%d record was successfully updated.',
        '%d records were successfully updated.',
        updated,
    ) % updated, messages.SUCCESS)
 

После того, как я выберу записи и нажму кнопку «Перейти», появится это сообщение:

 0 records were successfully updated.
 

Комментарии:

1. Вы выбирали элементы (с флажками) перед запуском действия?

2. @WillemVanOnsem Да, я это сделал. На самом деле я бы получил следующее сообщение об ошибке, если бы я этого не сделал: » Элементы должны быть выбраны для того, чтобы выполнять с ними действия. Никакие элементы не были изменены «.

3. @mahsakhazaei вы нашли проблему? Я вижу то же самое поведение.

4. @UmairA. К сожалению, я до сих пор не знаю, в чем проблема. Я думаю, что в итоге я получил список выбранных элементов во внешнем интерфейсе и передал его в представление через ajax, а остальное обработал в этом представлении.

Ответ №1:

У меня возникла аналогичная проблема, и я обнаружил, что этот метод options.response_action отвечает за обработку действия и получаемого им набора запросов.

В моем случае я использую mongodb, и этот метод response_action перезаписывает мой набор запросов (метод фильтрует по объектам pks, но для mongodb вам нужно предоставить экземпляры ObjectId для функции filter, а администратор django использует только строки).

 if not select_across:
    # Perform the action only on the selected objects
    queryset = queryset.filter(pk__in=selected)
    # `selected` here is a list of strings (and for mongodb should be bson.ObjectId)
    # that is the reason the queryset is empty in my case
 

Я решил эту проблему, создав пользовательский класс queryset для моей модели, и тщательно перезаписал функцию фильтра, чтобы преобразовать список строк в список bson.Идентификаторы объектов только в том случае, если фильтр включает в себя pk.

Я думаю, вам нужно отладить этот метод и выяснить, что происходит в вашем случае.

Удачи! Luis.-