2
votes

Comment obtenir les noms de sociétés dans la fonction de filtre de produit dans Django?

Je voudrais obtenir un dict JSON contenant tous les noms de produits, y compris les noms de société correspondants (voir la section «Sortie que je veux»). Ma fonction de recherche / filtrage renvoie des nombres en tant que sociétés, ce qui est faux (voir la section «Sortie que j'ai»). Merci!

Modèle de produit

{"products": [{"name": "bla 2", "company": "apple"}, {"name": "bla 1", "company": "samsung"}]}

Modèle d'entreprise

{"products": [{"name": "bla 2", "company": 3}, {"name": "bla 1", "company": 10}]}

Fonction de recherche / filtrage

product_names = Product.objects.filter(name__startswith=request.GET.get('query')).values('name', 'company')

Sortie que j'ai

class Company(models.Model):
    name = models.CharField(max_length=150)


5 commentaires

définissez name dans le modèle Company sur la clé primaire comme ceci: name = models.CharField (max_length = 150, primary_key = True)


Je ne pense pas que définir le nom comme clé primaire serait intelligent, car les produits / entreprises peuvent avoir des noms égaux.


Je souhaite conserver l'identifiant par défaut pk.


puis essayez à partir des sérialiseurs d'importation django.core , puis print (serializers.serialize ("json", [Product.objects.filter (name__startswith = request.GET.get ('query ery' ') ))]))


J'ai trouvé la réponse à ma question! C'était assez simple: product_names = Product.objects.filter (name__startswith = request.GET.get ('que‌ ry')). Values ​​('name', 'company__name'))


3 Réponses :


1
votes

Jetez un œil aux sérialiseurs ici: https: //www.django -rest-framework.org/api-guide/serializers/

Les sérialiseurs vous permettent de spécifier le format dans lequel les données de votre modèle sont présentées, ce qui ressemble à ce que vous souhaitez réaliser.


1 commentaires

J'ai trouvé la réponse à ma question! C'était assez simple: product_names = Product.objects.filter (name__startswith = request.GET.get ('que‌ ry')). Values ​​('name', 'company__name')) Merci!



2
votes

Voici ce qui a résolu mon problème:

product_names = Product.objects.filter(name__startswith=request.GET.get('query'))
.values('name', 'company__name'))


0 commentaires

1
votes

Si vous souhaitez afficher société au lieu de company__name dans votre dictionnaire, vous pouvez utiliser l'objet F avec annoter code > comme ceci:

from django.db.models import F

product_names = Product.objects.filter(name__startswith=request.GET.get('query'))
.values('name').annotate(company=F('company__name')))


3 commentaires

J'ai découvert qu'il existe un moyen encore plus court :) ..... values ​​('id', 'name', company_name = F ('company__name'))


@dunkubok Cela ne fonctionne pas. Et même si c'était le cas, vous incluriez toujours le champ id dans votre dictionnaire que vous n'avez pas mentionné dans votre question :)


@dunkubok .values ​​('id', 'name', company_name = F ('company__name')) affiche company_name et non company