У меня есть поле 'submission', в котором есть пользователь и проблема. Как я могу получить результат поиска SQL, который выдаст список только одного результата на проблему пользователя пара?
Модели похожи на это:
class Problem(models.Model):
title = models.CharField('Title', max_length = 100)
question = models.TextField('Question')
class Submission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
solution = models.CharKey()
time = models.DateTimeField('Time', auto_now_add=True)
Обновление 2 :
(После прочтения комментариев OP) Я предлагаю добавить новую модель для отслеживания последней отправки. Назовите это LatestSubmission
.
class LatestSubmission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
submission = models.ForeignKey(Submission)
Затем вы можете либо
Submission.save ()
, чтобы создавать / обновлять запись в LatestSubmission
каждый раз, когда пользователь публикует новое решение проблемы таким образом, что LatestSubmission
будет содержать одну строку для каждой комбинации проблема-пользователь-отправка, указывающая на последнюю отправку для проблемы каждым пользователем. После этого вы можете запустить один запрос:
LatestSubmission.objects.all().order_by('problem')
Обновление :
Поскольку OP опубликовал образец кода, решение теперь можно изменить следующим образом:
for user in User.objects.all(): # Get all users
user.submission_set.latest('time') # Pick the latest submission based on time.
Исходный ответ
В отсутствие каких-либо критериев, основанных на дате / времени, для определения того, что является «старым» или «новым», вы можете использовать первичный ключ ( id
) из Submission
, чтобы «пренебречь старыми» ".
for user in User.objects.all(): # Get all users
user.submission_set.latest('id') # Pick the latest submission by each user.
Попробуйте это:
distinct_users_problems = Submission.objects.all().values("user", "problem").distinct()
Это даст вам список dicts, подобный этому:
[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}]
содержащий все отличительные пары.
Это фактически приводит к вашему обычному SQL-запросу SELECT DISTINCT.