Задать вопрос
@vasy7991

Как передать несколько json списков в Django?

На сервер с помощью ajax отправляются данные на основе которых, выполняется фильтрация. Отфильтрованные объекты конвертируются в JSON формат и возвращаются на сервер. На данный момент я могу отправить в представление только один JSON это stations. Как отправить два JSON это stations и list_name_net_json?
AJAX запрос:
$(function () {
        $("#btn1").click(function () {
            var filter = GetSelectValue();
            $.ajax({
                type: "GET",
                dataType: 'json',
                url: '/map/filter/',
                data: {
                    'filter': filter
                },
                success:
                    function (stations, list_name_net_json) {
                        console.log(stations);
                        console.log(list_name_net_json);
                    },
                error: function (xhr, status, error) {
                    console.log(error);
                }
            })
        });
    });


views.py:
def filter(request):
    if request.GET:
        filter = request.GET.get('filter')
        decoded_filter = json.loads(filter)  # из строки инициализирует объект
        stations = Station.objects.all()
        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_list('idnet__name', flat=True)))
        list_name_net_json = json.dumps(list_name_net, cls=DjangoJSONEncoder)
    return HttpResponse(serializers.serialize('json', stations), content_type='application/json')
  • Вопрос задан
  • 1111 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@kova1ev
Знаком с джанго очень поверхностно, я в такой ситуации мастерил из квери сета объекты вручную, как то так:

from django.http import JsonResponse
from .models import User

def users(request):
    users = User.objects.all()
    output = []
    for elem in users:
        output.append(
            {"name": elem.name, "adress": elem.adress, "age": elem.age})
    return JsonResponse(output, safe=False)


То есть, в вашем коде можно stations также перебрать, и потом уже добавлять в общий массив ctx, который отправлять.

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)


Конечно, если в таблице будет дофига полей, такой способ не очень удобен, подпишусь чтобы узнать правильный ответ.

Или юзать django rest framework можно, там все это удобно сделано.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы