,
values et
distinct` en même temps dans Django entraînera des résultats inattendus.# 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)
--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)
#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é
#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()
ou
values / only / distinct`, cela peut altérer l'unicité du résultat.--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')
--Lorsque vous utilisez distinct / values / only / defer
+ ʻorder_by`, faites attention au type de SQL émis> I.