2017-07-18 1 views
0

Mes modèles:accès Ajax django ManyToManyField par id

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

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

Mes vues:

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, 
     }}) 

Mon 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]; 
    }; 
}; 

Le problème est que list_elem=[1, 4] contient l'identifiant des objets alors que j'ai besoin des noms list_elem=[tomato, peperoni]. Avec une clé étrangère, je peux utiliser l'option to_field=name dans le modèle, mais avec un ManyToManyField je ne peux pas. J'ai essayé myfield__name mais ne fonctionne pas (il donne erreur myfield__name is not defined). Alors, que puis-je faire? Je dois définir le pizza_list d'une manière différente à mon avis? Quel est un moyen efficace de gérer cela?

Merci

Répondre

0
  1. créer une nouvelle vue qui prend la id comme paramètre et retourne le nom dans JSON, par exemple {"name": "Jalapeno"}.
  2. Créez une fonction qui envoie une requête à l'URL connectée à cette vue que vous avez créée et capture la variable name à partir de la réponse JSON.
  3. Affichez la valeur à l'endroit voulu, par ex. displayElemName(elem_id).

Ce qui précède est l'idée générale que vous pouvez utiliser pour résoudre votre problème. Cependant, cela interrogera la base de données autant de fois qu'il y a d'éléments dans votre liste. Si vous êtes d'accord avec cela, cela fonctionnera très bien.

+0

Il n'y a pas un moyen plus efficace? parce que pizza_list est très longue (des milliers d'éléments) ce qui signifie quelques milliers de demandes – fabio

+0

Je ne pense pas. Peut-être que vous pouvez le faire à partir de Python, par exemple. quelque chose comme 'get_display_name()', mais pas de JavaScript, car il n'a pas accès à la relation. – MiniGunnR