Aggiunta di un campo ad una select con join

di il
6 risposte

Aggiunta di un campo ad una select con join

Salve,

uso python con django da poco e mi serve un chiarimento.

Ho una vista che uso per le operazioni CRUD
Per la singola Tabella va bene, però non ho capito come fare per aggiungere alla tabella un campo di un'altra tabella attraverso la ForeignKey.
Faccio un esempio e spero di essere chiaro.
Tabella 'Clienti' Anagrafica, Foto
Tabella 'Movimenti'  ClienteID (ForeignKey su Clienti), indirizzo, prezzo
In una view a livello di database é possibile aggiungere il campo foto della Tabella Clienti attraverso una join in modo da poter usare il campo foto in tutte le funzioni della classe ?

6 Risposte

  • Re: Aggiunta di un campo ad una select con join

    14/04/2024 - CiSono ha scritto:


    Per la singola Tabella va bene, però non ho capito come fare per aggiungere alla tabella un campo di un'altra tabella attraverso la ForeignKey.

    Ma non stai già parlando dello stesso problema in questa discussione?

  • Re: Aggiunta di un campo ad una select con join

    No sono 2 cose diverse

  • Re: Aggiunta di un campo ad una select con join

    Ok, ma qual è il problema di fare una JOIN? La sintassi di base la trovi con qualsiasi banale ricerca, in pagine come questa qui.

  • Re: Aggiunta di un campo ad una select con join

    Ti ri ngrazio per il link ma uso django e non mi è chiaro come inserire la join nella view

    Posto quello che ho fatto adesso per simulare una join.

     class AbbonamentiListaView(ListView):
        model = Abbonamenti  # Il modello (Tabella) degli oggetti che desideri visualizzare
        template_name = 'Pale/Tabelle/AbbonamentiLista.html'  # Il nome del tuo template HTML
        context_object_name = 'abbonamenti'  # Il nome della variabile di contesto nel template
    
        def get_queryset(self):
            # Prende tutto il set di dati
            queryset = super().get_queryset()
    
            # Se il campo di Ricerca é usato ritorna i Movimenti filtrati, altrimenti ritorna tutti i Movimenti
            query = self.request.GET.get('q', '')
    
            if query:  # Se c'è un input di ricerca, filtra i risultati
                # print('query ', query, AllenamentiSchede.objects.filter(ClienteID__Anagrafica__icontains=query))
                # return Abbonamenti.objects.filter(ClienteID__Anagrafica__icontains=query)
                queryset = queryset.filter(ClienteID__Anagrafica__icontains=query)
    
            # Cicla il set di dati per aggiunger il campo della Foto
            for abbona in queryset:
                # Controlla se il movimento ha un cliente associato e se ha un'immagine
                if abbona.ClienteID and abbona.ClienteID.Foto:
                    # Ottieni l'URL della foto del cliente per ogni movimento
                    fotoURL = abbona.ClienteID.Foto.url
                    # Stampa l'URL della foto del cliente per debug
                    print('URL della foto del cliente:', fotoURL)
    
                    # Aggiungi l'URL della foto del cliente all'oggetto movimento
                    abbona.fotoURL = fotoURL
    
            # else:  # Altrimenti, restituisci tutti i movimenti
            #     return Abbonamenti.objects.all()
    
            return queryset

    Attualmente ciclo il dataSet ma non mi sembra corretto, in quanto con tabella di tante righe si rallenterebbe
    Con una join potrebbe esssere più veloce e corretto ma non ho capito come e se si possa fare

  • Re: Aggiunta di un campo ad una select con join

    16/04/2024 - CiSono ha scritto:


    Attualmente ciclo il dataSet ma non mi sembra corretto, in quanto con tabella di tante righe si rallenterebbe
    Con una join potrebbe esssere più veloce e corretto ma non ho capito come e se si possa fare

    Qui vedo un solo ciclo, e non due come mi aspetterei (uno per la tabella principale, uno per la tabella correlata).

    Tra l'altro, ci sono dei commenti che disturbano, poi si parla di “Abbonamenti” nel codice mentre si fa riferimento a “Movimenti”… non si capisce nulla, sembra un template preso così com'è e poi ritoccato per farlo andare bene allo scenario, ma non è il modo corretto di procedere.

    La bacchetta magica non esiste: devi capire a cosa serve quel codice che hai scritto leggendo la documentazione, e una volta individuato i ruoli degli oggetti e dei metodi di cui dispongono, applicare la query con la JOIN al livello superiore.

  • Re: Aggiunta di un campo ad una select con join

    Scusa ripropongo la richiesta
    Ho 2 Tabelle Clienti e Abbonamenti

    Clienti tra i vari campi ha anche un campo Foto (ImageField)

    Abbonamenti ha un campo ClienteID collegato con una foreignKey alla Tabella Clienti

    Ho la view AbbonamentiViews.py con varie classi, una di queste é class AbbonamentiListaView(ListView):

    La funzione get_queryset di questa classe, provvede a filtrare e aggiungere il campo Foto

    La prima parte del codice controlla se deve filtrare la Tabella Abbonamenti in base ad un dato inserito dall'utente se previsto

        def get_queryset(self):
            # Prende tutto il set di dati
            queryset = super().get_queryset()
    
            # Se il campo di Ricerca é usato ritorna i Movimenti filtrati, altrimenti ritorna tutti i Movimenti
            query = self.request.GET.get('q', '')
    
            if query:  # Se c'è un input di ricerca, filtra i risultati
                # print('query ', query, AllenamentiSchede.objects.filter(ClienteID__Anagrafica__icontains=query))
                # return Abbonamenti.objects.filter(ClienteID__Anagrafica__icontains=query)
                queryset = queryset.filter(ClienteID__Anagrafica__icontains=query)

    La seconda parte del codice cicla la Tabella ed aggiunge il campo Foto

    
            for abbona in queryset:
                # Controlla se il movimento ha un cliente associato e se ha un'immagine
                if abbona.ClienteID and abbona.ClienteID.Foto:
                    # Ottieni l'URL della foto del cliente per ogni movimento
                    fotoURL = abbona.ClienteID.Foto.url
                    # Stampa l'URL della foto del cliente per debug
                    print('URL della foto del cliente:', fotoURL)
    
                    # Aggiungi l'URL della foto del cliente all'oggetto movimento
                    abbona.fotoURL = fotoURL
            return queryset

    In questa maniera, attraverso il template posso visualizzare la foto.
    La domanda é:

    E' giusto operare in tale maniera o c'é qualche comando per effettuare una join evitando il ciclo?

    Se non sono stato chiaro, dimmi quel'é la parte che devo chiarire

Devi accedere o registrarti per scrivere nel forum
6 risposte