CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Requête Django Rest Framework

lelouchvx
lelouchvx
Niveau 4
10 novembre 2020 à 16:54:23

Yo,

Il y a un truc que je n'ai pas très bien compris avec Django Rest Framework.

Mon fichier urls.py :

urlpatterns = [
path('messagerie/', MessagerieList.as_view()),
path('messagerie/<int:pk>', MessagerieDetail.as_view()),
]

Mon fichier views.py :

class MessagerieList(generics.ListCreateAPIView):
queryset = Messagerie.objects.all()
serializer_class = MessagerieSerializers

class MessagerieDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Messagerie.objects.all()
serializer_class = MessagerieSerializers

------------------------------------------------------------------------------------------

Là par exemple, si je vais sur l'url : localhost:8000/messagerie/
ça me renvoie bien tous les messages posté

Sauf que j'ai envie maintenant de savoir tous les messages poster par un utilisateur via
localhost:8000/messagerie/2 (pour l'utilsateur avec l'id 2)

Sauf que ça m'affiche uniquement le message avec l'id 2 pas avec l'utilisateur.

Voici ma table :
class Messagerie(models.Model):
expediteur = models.ForeignKey(User, related_name="+", on_delete=models.CASCADE)
destinataire = models.ForeignKey(User, related_name="+", on_delete=models.CASCADE)
message = models.TextField(max_length=250)
date = models.DateTimeField(auto_now_add=True)

Donc, comment faire en sorte que l'id que je mets correspond ici à expediteur et non l'id du message ?

El_Camino
El_Camino
Niveau 10
10 novembre 2020 à 19:15:02

Alors je connais pas beaucoup DRF etc mais deux choses me tilt

- pk signifie primary key donc il t'affiche le message qui a comme clef primaire 2. Ce que tu veux toi si je me trompe pas c 'est les messages oú la foreign key vaut 2 (== messages liés à l'user 2). Donc peut être remplacer pk par fk (Je suis pas sûr que ça marche).

- sinon il faut que tu filtres les messages en modifiant le queryset dans Messagerie Detail avec par exemple queryset = Messagerie.objects.all(expediteur__id = 2)

lelouchvx
lelouchvx
Niveau 4
11 novembre 2020 à 00:06:05

Yep entre temps je me suis taper la tête sur Django Rest Framework et j'ai enfin réussi à faire ce que je voulais.

Déjà erreur numéro 1 : generics.RetrieveUpdateDestroyAPIView n'est pas fait pour récupérer autre chose qu'un seul résultat de la base de données.

Donc en fait, fallait bosser sur generics.ListCreateAPIView.

Et faire ceci pour par exemple, recevoir les derniers messages unique par couple d'id entre deux users (un peu comme l'application Messenger où la page d'accueil est le dernier message d'une conversation).

-------------------------------------------------------------------------------------------------------------------

Dans views.py :

class MessagerieList(generics.ListCreateAPIView):
    serializer_class = MessagerieSerializers
    
    def get_queryset(self):
        queryset = Messagerie.objects.all()
        exp = self.kwargs.get('expediteur', None)

        if exp is not None:
            queryset = Messagerie.objects.raw("select * from api_pwa_messagerie WHERE expediteur_id = %s or destinataire_id = %s GROUP BY destinataire_id ORDER BY date DESC;", [exp, exp])
        return queryset

Dans urls.py


urlpatterns = [
    path('getMessage/<int:expediteur>', MessagerieList.as_view()),
    path('getMessage/', MessagerieList.as_view()),
    ...
]

C'était la colle mais ça fait exactement ce que je veux. En tout cas merci d'avoir pris le temps de répondre El_Camino

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment