Πώς να γράψετε αποτελεσματικές προβολές, μοντέλα και ερωτήματα στο Django

Μου αρέσει το Τζάνγκο. Είναι ένα καλά μελετημένο και διαισθητικό πλαίσιο με ένα όνομα που μπορώ να προφέρω δυνατά. Μπορείτε να το χρησιμοποιήσετε για να δημιουργήσετε γρήγορα ένα έργο μεγέθους Σαββατοκύριακου και μπορείτε επίσης να το χρησιμοποιήσετε για να εκτελέσετε πλήρεις εφαρμογές παραγωγής σε κλίμακα.

Έχω κάνει και τα δύο αυτά πράγματα, και με τα χρόνια ανακάλυψα πώς να χρησιμοποιώ μερικά από τα χαρακτηριστικά του Django για μέγιστη απόδοση. Αυτά είναι:

  • Προβολές βασισμένες στην κατηγορία έναντι λειτουργιών
  • Μοντέλα Django
  • Ανάκτηση αντικειμένων με ερωτήματα

Ας δούμε πώς αυτά τα εργαλεία σάς επιτρέπουν να δημιουργήσετε μια εκτεταμένη εφαρμογή Django που είναι ευχάριστη στην κατασκευή και τη συντήρηση.

Προβολές βασισμένες στην κατηγορία έναντι λειτουργιών

Θυμηθείτε ότι ο Django είναι ο Python κάτω από την κουκούλα. Όσον αφορά τις προβολές, έχετε δύο επιλογές: λειτουργίες προβολής (μερικές φορές ονομάζονται "προβολές βάσει λειτουργιών") ή προβολές βάσει κατηγορίας.

Πριν από χρόνια, όταν δημιούργησα για πρώτη φορά το ApplyByAPI, αρχικά αποτελούταν αποκλειστικά από προβολές βάσει λειτουργιών. Αυτά προσφέρουν λεπτομερή έλεγχο, και είναι καλό για την εφαρμογή σύνθετης λογικής. Ακριβώς όπως σε μια λειτουργία Python, έχετε τον πλήρη έλεγχο (για καλύτερα ή χειρότερα) για το τι κάνει η προβολή.

Αλλά με μεγάλο έλεγχο έρχεται μεγάλη ευθύνη και οι προβολές βάσει λειτουργιών μπορεί να είναι λίγο κουραστικές στη χρήση. Είστε υπεύθυνοι για τη σύνταξη όλων των απαραίτητων μεθόδων για να λειτουργήσει η προβολή - αυτό σας επιτρέπει να προσαρμόσετε πλήρως την αίτησή σας.

Στην περίπτωση του ApplicationByAPI, υπήρχαν μόνο λίγα μέρη όπου το επίπεδο προσαρμοσμένης λειτουργικότητας ήταν πραγματικά απαραίτητο. Παντού αλλού, οι προβολές βάσει λειτουργιών άρχισαν να δυσκολεύουν τη ζωή μου. Το γράψιμο μιας ουσιαστικά μιας προσαρμοσμένης προβολής για λειτουργίες κατά τη διάρκεια του μύλου, όπως η εμφάνιση δεδομένων σε μια σελίδα λίστας έγινε κουραστική, επαναλαμβανόμενη και επιρρεπής σε σφάλματα.

Με προβολές βάσει λειτουργιών, θα χρειαστεί να μάθετε ποιες μεθόδους Django θα εφαρμόσετε προκειμένου να χειριστείτε αιτήματα και να μεταβιβάσετε δεδομένα σε προβολές. Ο έλεγχος μονάδων μπορεί να χρειαστεί λίγη δουλειά για να γραφτεί. Εν ολίγοις, ο κοκκώδης έλεγχος που προσφέρει οι προβολές βάσει λειτουργιών απαιτεί επίσης κάποιο κοκκώδες διάλειμμα για σωστή εφαρμογή.

Κατέληξα να συγκρατήσω το ApplyByAPI, ενώ επαναπροσέγγισα την πλειοψηφία των προβολών σε προβολές βάσει κατηγορίας. Αυτό δεν ήταν μια μικρή δουλειά και αναπαράσταση, αλλά όταν έγινε, είχα μια μικρή μικροσκοπική θέα που έκανε μια τεράστια διαφορά. Εννοώ, απλώς κοιτάξτε αυτό:

class ApplicationsList(ListView): model = Application template_name = "applications.html" 

Είναι τρεις γραμμές. Η εργονομία του προγραμματιστή μου και η ζωή μου έγιναν πολύ πιο εύκολα.

Μπορεί να θεωρήσετε προβολές βάσει τάξης ως πρότυπα που καλύπτουν το μεγαλύτερο μέρος της λειτουργικότητας που χρειάζεται οποιαδήποτε εφαρμογή. Υπάρχουν προβολές για προβολή λιστών πραγμάτων, για προβολή λεπτομερειών, και επεξεργασία προβολών για εκτέλεση λειτουργιών CRUD (Δημιουργία, Ανάγνωση, Ενημέρωση, Διαγραφή).

Επειδή η εφαρμογή μιας από αυτές τις γενικές προβολές διαρκεί μόνο μερικές γραμμές κώδικα, η λογική της εφαρμογής μου έγινε δραματικά σύντομη. Αυτό μου έδωσε λιγότερο επαναλαμβανόμενο κώδικα, λιγότερα μέρη για κάτι να πάει στραβά και μια πιο εύχρηστη εφαρμογή γενικά.

Οι προβολές βάσει κατηγορίας είναι γρήγορες για εφαρμογή και χρήση. Οι ενσωματωμένες γενικές προβολές που βασίζονται στην τάξη ενδέχεται να απαιτούν λιγότερη εργασία για δοκιμή, καθώς δεν χρειάζεται να γράφετε δοκιμές για την προβολή βάσης που παρέχει το Django. (Το Django κάνει τις δικές του δοκιμές για αυτό · δεν χρειάζεται να ελέγξει ξανά η εφαρμογή σας.)

Για να τροποποιήσετε μια γενική προβολή στις ανάγκες σας, μπορείτε να υποκαταστήσετε μια γενική προβολή και να παρακάμψετε χαρακτηριστικά ή μεθόδους. Στην περίπτωσή μου, δεδομένου ότι χρειαζόμουν μόνο να γράψω δοκιμές για τυχόν προσαρμογές που πρόσθεσα, τα δοκιμαστικά αρχεία μου έγιναν δραματικά μικρότερα, όπως και ο χρόνος και οι πόροι που χρειάστηκαν για την εκτέλεση τους.

Όταν σταθμίζετε την επιλογή μεταξύ προβολών βάσει λειτουργίας ή κατηγορίας, λάβετε υπόψη το μέγεθος της προσαρμογής που χρειάζεται η προβολή και τη μελλοντική εργασία που θα είναι απαραίτητη για τη δοκιμή και τη συντήρησή της.

Εάν η λογική είναι κοινή, ενδέχεται να μπορείτε να ξεκινήσετε με μια γενική προβολή που βασίζεται στην κλάση. Εάν χρειάζεστε επαρκή λεπτομέρεια που η επανεγγραφή των μεθόδων μιας βασικής προβολής θα την καθιστούσε υπερβολικά περίπλοκη, εξετάστε αντ 'αυτού μια προβολή βάσει λειτουργίας.

Μοντέλα Django

Τα μοντέλα οργανώνουν τις κεντρικές ιδέες της εφαρμογής Django για να τις καταστήσουν ευέλικτες, στιβαρές και εύκολες στην εργασία. Εάν χρησιμοποιούνται με σύνεση, τα μοντέλα είναι ένας ισχυρός τρόπος για να συγκεντρώσετε τα δεδομένα σας σε μια οριστική πηγή αλήθειας.

Όπως και οι προβολές, το Django παρέχει ορισμένους ενσωματωμένους τύπους μοντέλων για την ευκολία εφαρμογής βασικού ελέγχου ταυτότητας, συμπεριλαμβανομένων των μοντέλων χρήστη και αδειών. Για οτιδήποτε άλλο, μπορείτε να δημιουργήσετε ένα μοντέλο που αντικατοπτρίζει την ιδέα σας, κληρονομώντας από μια γονική τάξη μοντέλου.

class StaffMember(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) company = models.OneToOneField(Company, on_delete=models.CASCADE) def __str__(self): return self.company.name + " - " + self.user.email 

Όταν δημιουργείτε ένα προσαρμοσμένο μοντέλο στο Django, ταξινομείτε την κατηγορία Model Django και εκμεταλλεύεστε όλη της τη δύναμη. Κάθε μοντέλο που δημιουργείτε γενικά χάρτες σε έναν πίνακα βάσεων δεδομένων. Κάθε χαρακτηριστικό είναι ένα πεδίο βάσης δεδομένων. Αυτό σας δίνει τη δυνατότητα να δημιουργήσετε αντικείμενα για να εργαστείτε με τα οποία οι άνθρωποι μπορούν να κατανοήσουν καλύτερα.

Μπορείτε να κάνετε ένα μοντέλο χρήσιμο για εσάς καθορίζοντας τα πεδία του. Πολλοί ενσωματωμένοι τύποι πεδίων παρέχονται εύκολα. Αυτά βοηθούν το Django να καταλάβει τον τύπο δεδομένων, το widget HTML που θα χρησιμοποιηθεί κατά την απόδοση μιας φόρμας, ακόμη και τις απαιτήσεις επικύρωσης φόρμας. Εάν χρειαστεί, μπορείτε να γράψετε προσαρμοσμένα πεδία μοντέλου.

Οι σχέσεις βάσης δεδομένων μπορούν να καθοριστούν χρησιμοποιώντας ένα πεδίο ForeignKey (πολλά προς ένα) ή ένα ManyToManyField (σας δίνουμε τρεις εικασίες). Εάν αυτά δεν αρκούν, υπάρχει επίσης ένα OneToOneField.  

Μαζί, αυτά σας επιτρέπουν να καθορίσετε τις σχέσεις μεταξύ των μοντέλων σας με επίπεδα πολυπλοκότητας που περιορίζονται μόνο από τη φαντασία σας. (Ανάλογα με τη φαντασία που έχετε, αυτό μπορεί ή όχι να είναι πλεονέκτημα.)

Ανάκτηση αντικειμένων με ερωτήματα

Χρησιμοποιήστε τον Διαχειριστή του μοντέλου σας ( objectsαπό προεπιλογή) για να δημιουργήσετε ένα QuerySet. Αυτή είναι μια αναπαράσταση αντικειμένων στη βάση δεδομένων που μπορείτε να κάνετε πιο συγκεκριμένα, χρησιμοποιώντας μεθόδους, για να ανακτήσετε συγκεκριμένα υποσύνολα. Όλες οι διαθέσιμες μέθοδοι είναι στο QuerySet API και μπορούν να συνδεθούν μαζί για ακόμη περισσότερη διασκέδαση.

Post.objects.filter( type="new" ).exclude( title__startswith="Blockchain" ) 

Ορισμένες μέθοδοι επιστρέφουν νέα QuerySets, όπως filter(), ή exclude(). Η αλυσίδα αυτών μπορεί να σας δώσει ισχυρά ερωτήματα χωρίς να επηρεαστεί η απόδοση, καθώς τα QuerySets δεν λαμβάνονται από τη βάση δεδομένων έως ότου αξιολογηθούν. Μέθοδοι που αξιολογούν ένα QuerySet περιλαμβάνουν get(), count(), len(), list(), ή bool().

Η επανάληψη μέσω ενός QuerySet το αξιολογεί επίσης, οπότε αποφύγετε να το κάνετε όπου είναι δυνατόν για να βελτιώσετε την απόδοση του ερωτήματος. Για παράδειγμα, εάν θέλετε απλώς να μάθετε εάν υπάρχει ένα αντικείμενο, μπορείτε να το χρησιμοποιήσετε exists()για να αποφύγετε την επανάληψη πάνω από αντικείμενα βάσης δεδομένων.

Χρησιμοποιήστε το get()σε περιπτώσεις όπου θέλετε να ανακτήσετε ένα συγκεκριμένο αντικείμενο. Αυτή η μέθοδος εγείρει MultipleObjectsReturnedαν συμβεί κάτι απροσδόκητο, καθώς και η DoesNotExistεξαίρεση, εάν, μαντέψτε.

Εάν θέλετε να λάβετε ένα αντικείμενο που ενδέχεται να μην υπάρχει στο πλαίσιο ενός αιτήματος ενός χρήστη, χρησιμοποιήστε το βολικό get_object_or_404()ή το get_list_or_404()οποίο δημιουργεί Http404αντί DoesNotExist. Αυτές οι χρήσιμες συντομεύσεις είναι κατάλληλες για αυτόν ακριβώς τον σκοπό. Για να δημιουργήσετε ένα αντικείμενο που δεν υπάρχει, υπάρχει επίσης το βολικό get_or_create().

Αποτελεσματικά βασικά

Έχετε τώρα μια λαβή σε αυτά τα τρία βασικά εργαλεία για την οικοδόμηση της αποτελεσματικής σας εφαρμογής Django - συγχαρητήρια!

Υπάρχουν πολλά περισσότερα που μπορεί να κάνει το Django για εσάς, οπότε μείνετε συντονισμένοι για μελλοντικά άρθρα.

Αν πρόκειται να βασιστείτε στο GitHub, ίσως θελήσετε να ρυθμίσετε το django-security-check GitHub Action. Εν τω μεταξύ, είστε έτοιμοι να δημιουργήσετε ένα όμορφο έργο λογισμικού.