Запрос Django, выделенный по парам полей

У меня есть поле '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)
8
задан Peter Mortensen 3 September 2010 в 09:50
поделиться

2 ответа

Обновление 2 :

(После прочтения комментариев OP) Я предлагаю добавить новую модель для отслеживания последней отправки. Назовите это LatestSubmission .

class LatestSubmission(models.Model):
    user = models.ForeignKey(User)     
    problem = models.ForeignKey(Problem)
    submission = models.ForeignKey(Submission)

Затем вы можете либо

  1. переопределить Submission.save () , чтобы создавать / обновлять запись в LatestSubmission каждый раз, когда пользователь публикует новое решение проблемы
  2. присоедините функцию, которая делает то же самое к подходящему сигналу .

таким образом, что 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.
3
ответ дан 5 December 2019 в 10:38
поделиться

Попробуйте это:

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.

13
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: