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)
3 Réponses :
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.
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!
Voici ce qui a résolu mon problème:
product_names = Product.objects.filter(name__startswith=request.GET.get('query')) .values('name', 'company__name'))
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')))
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
définissez
name
dans le modèleCompany
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
, puisprint (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'))