Django возвращает дубликаты, даже если используется функция distinct()
Я использую django=4.1, python=3.8 & sqlite. Я хочу отфильтровать пять лучших очков игроков и уникальных игроков за определенный месяц и представить их в шаблоне, дубликатов быть не должно. Это модель PlayerPoint:
class PlayerPoint(models.Model):
OPERATION_CHOICES = (('ADD', 'ADD'), ('SUB', 'SUBTRACT'), ('RMN', 'REMAIN'))
points = models.IntegerField(null=False, default=0)
operation = models.CharField(
max_length=3,
null=False,
choices=OPERATION_CHOICES,
default=OPERATION_CHOICES[2][0]
)
operation_amount = models.IntegerField(null=False)
operation_reason = models.CharField(null=False, max_length=1500)
player = models.ForeignKey(
settings.AUTH_USER_MODEL,
null=False,
on_delete=models.PROTECT,
to_field="phone_number",
related_name="player_points"
)
points_ts = models.DateTimeField(auto_now_add=True, null=False)
А это модель игрока:
class Player(AbstractUser):
phone_number = models.CharField(
max_length=14,
unique=True,
help_text="Please ensure +251 is included"
)
first_name = models.CharField(
max_length=40,
help_text="please ensure that you've spelt it correctly"
)
father_name = models.CharField(
max_length=40,
help_text="please ensure that you've spelt it correctly"
)
grandfather_name = models.CharField(
max_length=40,
help_text="please ensure that you've spelt it correctly"
)
email = models.EmailField(
unique=True,
help_text="please ensure that the email is correct"
)
age = models.CharField(max_length=3)
profile_pic = models.ImageField(upload_to='profile_pix', default='profile_pix/placeholder.jpg')
joined_ts = models.DateTimeField(auto_now_add=True, null=False)
username = None
Когда я выполняю приведенный ниже запрос, он выдает мне 5 лучших очков игроков, но они не различаются, идентификаторы игроков дублируются. Он продолжает повторять одного и того же игрока.
q = PlayerPoint.objects.filter(points_ts__year=2023, points_ts__month=1, points__gte=2000)
x = q.order_by('-points')
y = x.values_list('player_id', flat=True).distinct()
print(y)
Вывод: <QuerySet [('+251703445566',), ('+251703445566',), ('+251703445566',), ('+251703445566',), ('+251703445566',), ('+251703445566',)]>
Как видите, это одни и те же номера телефонов, означающие одного и того же игрока.
Как это исправить?
Заранее благодарю за прочтение и помощь.
Используйте запрос DISTINCT
PlayerPoint.objects.filter(...).values_list("player_id", flat=true).order_by("player_id").distinct()