[PYTHON] Django order_by notes

Aperçu

environnement

supposition

# polls/models.py

class Question(models.Model):

    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):

    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
q1 = Question.objects.get(question_text='question1')
q2 = Question.objects.get(question_text='question2')

Choice.objects.create(question=q1, choice_text='choice1', votes=1)
Choice.objects.create(question=q1, choice_text='choice2', votes=1)
Choice.objects.create(question=q2, choice_text='choice3', votes=1)
Choice.objects.create(question=q2, choice_text='choice4', votes=1)

1. Réduisez les colonnes à sélectionner

--SELECT uniquement la clé externe de Choice, question (= question_id)

#Squeeze par valeurs--
Choice.objects.values('question')
--SQL à exécuter
mysql> SELECT `polls_choice`.`question_id` FROM `polls_choice`;
+-------------+
| question_id |
+-------------+
|           1 |
|           1 |
|           2 |
|           2 |
+-------------+
4 rows in set (0.00 sec)

2. Ajoutez «distinct» à 1

#Supprimer les doublons avec distinct--
Choice.objects.values('question').distinct()
--SQL à exécuter
mysql> SELECT DISTINCT `polls_choice`.`question_id` FROM `polls_choice`;
+-------------+
| question_id |
+-------------+
|           1 |
|           2 |
+-------------+
2 rows in set (0.00 sec)

――Il a été correctement dédupliqué

3.2 Ajouter ʻorder_by` à 2

#Ordre dans un champ différent du champ restreint par des valeurs_par
Choice.objects.values('question').distinct().order_by('-id')
--SQL à exécuter
--Pour une raison quelconque, commandez_Le champ spécifié par est SELECTed...
mysql> SELECT DISTINCT `polls_choice`.`question_id`, `polls_choice`.`id` FROM `polls_choice` ORDER BY `polls_choice`.`id` DESC;
+-------------+----+
| question_id | id |
+-------------+----+
|           2 |  4 |
|           2 |  3 |
|           1 |  2 |
|           1 |  1 |
+-------------+----+
4 rows in set (0.00 sec)
class Choice(models.Model):

    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    class Meta:
        ordering = ('-id',)
Choice.objects.values('question').distinct().order_by()

Les champs spécifiés comme ʻorder_by` dans Django sont SELECTed

DISTINCT ON peut être utilisé pour Postgres

--Si le backend est Postgres, vous pouvez utiliser DISTINCT ON, ainsi vous pouvez passer la cible à la méthode distinct.

Choice.objects.values('question').distinct('question').order_by('question', '-id')

Résumé

--Lorsque vous utilisez distinct / values / only / defer + ʻorder_by`, faites attention au type de SQL émis> I.

référence

Recommended Posts

Django order_by notes
JetBrains_learning notes_003
Notes SQL
Notes de pandas
Mémo Sphinx
Mémo Django
Jupyter_learning notes_000
ImageField de Django
Mémo Django