Как сделать пользовательский порядок набора запросов Django? - PullRequest
3 голосов
/ 04 октября 2011

Немного предыстории о нашей конкретной проблеме ->

Мы пытаемся создать сайт вопросов и ответов, очень похожий на Stackoverflow.
Люди могут приходить и задавать вопросы, а другие - отвечать.

Так что, как и SO (https://stackoverflow.com/questions), у нас есть страница с вопросами. Теперь проблема в том, что у нас есть эта модель:

class Questions(models.Models):   
    user = person
    question = CharField   
    number_of_replies = IntegerField  
    datetime = DateTime

Результирующий набор запросов (или список) определяется сочетанием различных факторов, например, когда он был опубликован, сколько людей ответили на него и т. Д.

Поскольку возникла путаница, связанная с вопросом, я проясню его -> Это тот тип вывода, который я ищу:

Вот так будет выглядеть окончательный заказ ->

  1. Вопрос c отправлено 10 минут назад, 0 ответов
  2. Вопрос опубликован 1 минуту назад, 2 ответа
  3. Вопрос b опубликован 5 минут назад, 1 ответ и т.д.
    так что нет одномерного порядка, порядок является функцией различных параметров

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Один из способов сделать это - определить собственный менеджер ->

https://docs.djangoproject.com/en/dev/topics/db/managers/#custom-managers-and-model-inheritance.

Вы можете отображать объекты в любом порядке.Вы даже можете возвращать списки и самостоятельно определенные словари, используя пользовательские методы менеджера.

1 голос
/ 04 октября 2011

Каждое ваше необходимое условие представляет набор запросов.

Вопросы, оставшиеся без ответа и опубликованные за последние "X" минут:

unanswered_questions = Question.objects.filter(timestamp__gte=(now()-time(min=5))).annotate(answers_count=Count('Answer')).filter(answers_count=0)

и аналогично.

Похоже, вы хотите отобразить комбинацию из нескольких наборов запросов. Для этого вы можете использовать метод itertools.chain, чтобы объединить и отобразить результат нескольких наборов запросов в вашем шаблоне, например:

combined_queryset = chain(recent_questions,unanswered_questions,...)

Имейте в виду, однако, что если в этих наборах запросов есть перекрывающиеся условия, некоторые вопросы могут повторяться. Вы можете избежать этого, явно преобразовав результат одного набора запросов в следующие, или вы можете преобразовать набор запросов в список и позволить типу set.union позаботиться о возможных дубликатах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...