2010-08-14 8 views
8

У меня есть поле «подчинение», у которого есть пользователь и проблема. Как я могу получить результат поиска SQL, который даст список только одного результата на пару проблем пользователя?Django select select по полю

Модели так:

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) 
+0

Что вы подразумеваете под «полем, в котором есть пользователь и проблема»? Вы говорите о моделях Django? Отправьте соответствующий код. –

+0

Модели, как это: Проблема: название, вопрос Представление: проблема (ForeignKey), пользователь (ForeignKey), содержание пользователя: Аутентификация пользователя Давайте предположим, что p1, p2 две проблемы и u1, u2 являются два пользователя u1 имеет два представления s1, s2 для p1 и один (s3) для p2 и u2 имеют один для p1 (s4), два для p2 (s5, s6) Так что я хочу получить результат запроса так: s2, s3, s4, s6 т. Е. Пренебрегать старыми с той же проблемой пользователя s2, s3, – crodjer

ответ

3

Update 2:

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

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

Вы можете либо

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

такой, что LatestSubmission будет содержать одну строку в каждой комбинации проблем-пользователей, указывающую на последнюю отправку проблемы для каждого пользователя. После того как вы это в месте, вы можете запустить один запрос:

LatestSubmission.objects.all().order_by('problem') 

Update:

Поскольку 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. 
+0

Я добавил детали модели к своей проблеме. Это даст мне только набор запросов последнего представления пользователем, а то, что я хочу, является последним результатом для всех проблем. Я хочу запустить команду sql в поле отправки и получить список заявок, заказанных по времени отправки, и будет включать только один результат, если в одной проблеме будет несколько представлений одного и того же пользователя. – crodjer

+0

@Rohan Jain: Я не уверен, что вы можете сделать это с помощью _one_ SQL-запроса, учитывая вашу структуру модели _current_. Я хотел бы знать, может ли кто-нибудь еще придумать подходящий ответ. –

+0

Я делаю это сейчас, добавляя булевое поле is_latest для представления ..... thanx fr ur помогает :) – crodjer

12

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

distinct_users_problems = Submission.objects.all().values("user", "problem").distinct() 

Это даст вам список dicts как этот:

[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}] 

, содержащий все различные пары.

Это фактически приводит к обычному запросу SELECT DISTINCT SQL.