Отправление одного запроса на JS в проекте Django

Разрабатываю проект на Django. У меня обрабатывается очень много запросов, 70 в секунду, т.к, у меня 7 элементов. Мне нужно их существенно сократить, чтобы не нагружать трафик. Перед тем, как сделать WebSocket, решила разобраться с этой ситуацией.

Был вариант вызывать каждый элемент из списка, вот они:

actions = {'MainLight': 'V21',
           'Candles': 'V22',
           'LineLight': 'V23',
           'Blinds': 'V10',
           'Temp': 'V31',
           'Hum': 'V32',
           'Light': 'V33'
           }

И что-то с ними делать. Не знаю, как это реализовать.

Вот мой кусок кода на JS, если он конечно чем-то поможет...

setInterval(function() {
        $.each($('.command'), function (e) {
            var currentElement = $(this);
            $.ajax({
                type: "GET",
                url: "/info",
                async: true,
                cache: false,
                timeout: 500,
                data: {action: currentElement.attr('id')},
                success: function (data) {
                    if (data == '0') {
                        currentElement.removeClass("btn-warning");
                        currentElement.addClass("btn-primary");
                    } else {
                        currentElement.addClass("btn-warning");
                        currentElement.removeClass("btn-primary");
                    }
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                }
            });
        });
        $.each($('.info'), function (e) {
            var currentElement = $(this);
            $.ajax({
                type: "GET",
                url: "/info",
                async: true,
                cache: false,
                timeout: 500,
                data: {action: currentElement.attr('id')},
                success: function (data) {
                    currentElement.text(data);
                },
                error: function (XMLHttpRequest, textStatus, errorThrown) {
                }
            });
        });
    }, 1000);
})

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

def filter(request):
    if request.GET:
        filter = request.GET.get('filter')
        decoded_filter = json.loads(filter)  # из строки инициализирует объект
        stations = Station.objects.all()

        stations_out = []
        for elem in stations:
            stations_out.append({}) #создаем нужный объект

        id_net = Net.objects.filter(name=decoded_filter["net"])
        list_id_stations = Networkstations.objects.filter(idnet__in=id_net).values_list("idstation", flat=True)
        list_name_net = []
        if decoded_filter["net"] != 'all':
            stations = stations.filter(id__in=list_id_stations)
        if decoded_filter["type"] != 'all':
            stations = stations.filter(type=decoded_filter["type"])
        for station in stations:
            list_name_net.append(
                list(Networkstations.objects.filter(idstation=station.id).values('idnet__name')))
        ctx = {
            'stations': stations_out,
            'list_name_net': list_name_net,
        }
    return JsonResponse(ctx, safe=False)

Ответы (1 шт):

Автор решения: MrFo_OrD

сформулируйте свой вопрос более корректно. Из того что я понял, вы пытаетесь отослать все id дочерних элементов класса .command и .info и обработать их в Django.

В вашей функции filter в строчке filter = request.GET.get('filter') вы пытаетесь получить GET параметр с ключом filter, хотя в двух AJAX запросах отсылается GET параметр с ключом action и поскольку такого ключа нету в GET запросе, то в переменную filter, у вас помещается None и в следующей строчке вы пытаетесь десериализавать этот None, это уже должно приводить к ошибке.

id_net = Net.objects.filter(name=decoded_filter["net"])
        list_id_stations = Networkstations.objects.filter(idnet__in=id_net).values_list("idstation", flat=True)

Здесь, вы пытаетесь, сначала получить значения по несуществующему ключу net, а затем отфильтровать поле idnet по экземпляру класса QuerySet, что опять же должно приводит к ошибке. Если вы хотите отфильтровать поля таким образом, то вам нужно сделать так:

id_net = Net.objects.filter(name=decoded_filter["net"])
for id in id_net:
  Networkstations.objects.filter(**{'idnet__in':id.some_field}).values_list("idstation", flat=True)
if decoded_filter["net"] != 'all':
            stations = stations.filter(id__in=list_id_stations)
        if decoded_filter["type"] != 'all':
            stations = stations.filter(type=decoded_filter["type"])
        for station in stations:
            list_name_net.append(
                list(Networkstations.objects.filter(idstation=station.id).values('idnet__name')))

Затем вы совершаете такую же ошибку, пытаясь отфильтровать поле id по экземпляру класса QuerySet, получить значение по несуществующему ключу decoded_filter["type"], что опять же приводит к ошибке.

Подведем итоги. Я склоняюсь к выводу, что вы скопировали откуда-то код Django, а JS писали сами и поэтому у вас ничего не получилось. Я могу лишь посоветовать вам почитать документацию по filter и полную документацию по Django, либо покажите полный JS и полный Django код из которого был показан этот кусок, что бы хоть как-то вам помочь.

→ Ссылка