Ajax доступ по django ManyToManyField по id

Мои модели:

class Topping(models.Model):
    name=models.CharField(max_length=24)

class Pizza(models.Model):
    toppings=models.ManyToManyField(Topping)

Мои взгляды:

def get_pizza(request):
    if request.is_ajax():
        pizza_list=[]
        pizza_list=Pizza.objects.all()
        pizza_list_json = serializers.serialize('json', pizza_list)
        return JsonResponse({'result': 'OK', 'data': { 
            'pizza_list': pizza_list_json, 
        }})

Мой Javascript:

function get_pizza() {
    $.ajax({type: 'POST',
        url: '/path/get_pizza/',
        data: {
        },
        success: function (lista) {
            if (lista.result === 'OK') {
                var pizza_list_json=lista.data.pizza_list;
                pizza_list = JSON.parse(pizza_list_json);
                make_pizza(pizza_list);
            };
        }
    });
};

function make_pizza() {
    for (i=i; i<pizza_list.length; i++) {
        var myfield=toppings;
        var list_elem=pizza_list[i].fields[myfield];
    };
};

Проблема в том, что list_elem=[1, 4] содержит идентификатор объектов, а мне нужны имена list_elem=[tomato, peperoni], С внешним ключом я могу использовать to_field=name вариант в модели, но с ManyToManyField Я не могу Я старался myfield__name но не работает (это дает myfield__name is not defined ошибка). Так что я могу сделать? Я должен определить pizza_list по-другому, на мой взгляд? Какой эффективный способ справиться с этим?

Спасибо

1 ответ

  1. Создайте новый вид, который принимает id в качестве параметра и возвращает имя в формате JSON, например {"name": "Jalapeno"},
  2. Создайте функцию, которая отправляет запрос на URL-адрес, связанный с созданным вами представлением, и записывает name переменная из ответа JSON.
  3. Показать значение, где вы хотите, например, displayElemName(elem_id),

Выше приведена общая идея, которую вы можете использовать для решения вашей проблемы. Тем не менее, это будет запрашивать базу данных столько раз, сколько элементов в вашем списке. Если вы согласны с этим, то это будет работать нормально.

Другие вопросы по тегам