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
namedans le modèleCompanysur 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'))