Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 9, 2012 13:38:56

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка many-to-many

Здравствуйте!

Делаю афишу

Модель такая:

class Date(models.Model):
    date = models.DateTimeField(u'Дата', unique=True)
class Event(models.Model):
    user = models.ForeignKey(User, verbose_name=u'Пользователь')
    name = models.CharField(u'Название', max_length=100)
    
    dates = models.ManyToManyField(Date, verbose_name=u'Даты')
    #остальные поля

Это позволяет привязывать к событию несколько дат

Выбираю события так:
def events(request, category=None):
    now = datetime.datetime.now()
    events = Event.objects
    if category:
        category = get_object_or_404(Category, uid=category)
        events = events.filter(category=category)
    # собственно вопрос здесь:
    # т.к у меня many-to-many мне нужно убрать повторяющиеся события,
    # и оставить события которые уже проходят или только начнуться
    # я сделал так:
    events_list = []
    for event in events.filter(dates__date__gte=now):
        if event not in events_list: events_list.append(event)
    events = events_list

правильно ли это или можно лучше ?



Офлайн

#2 Дек. 9, 2012 14:31:46

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Выборка many-to-many

events.filter(dates__date__gte=now).distinct()
?

Офлайн

#3 Дек. 9, 2012 15:25:14

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка many-to-many

reclosedev

Если использовать .distinct(), то выводит события которые только начнутся (dates__date__gte=now)

А нужно вывести события которые уже проходят или только начнуться



Офлайн

#4 Дек. 10, 2012 02:37:10

Antonio051
От:
Зарегистрирован: 2011-01-06
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Выборка many-to-many

andreiru
events = Event.objects
events = Event.objects.prefetch_related()

andreiru
которые уже проходят
Выбрать, которые сегодня проходят устроит?
now = datetime.date.today()
events.filter(dates__date__gte=now).distinct()
Или
andreiru
которые уже проходят
В течении какого времени? Час, Два, Шесть, 12, 20?
Из переменной now отнимите это время. Есть объект timedelta (http://docs.python.org/2/library/datetime.html#timedelta-objects)



Офлайн

#5 Дек. 10, 2012 16:43:22

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Выборка many-to-many

andreiru
Если использовать .distinct(), то выводит события которые только начнутся (dates__date__gte=now)
У Вас в коде тоже самое вроде.

Antonio051
В течении какого времени? Час, Два, Шесть, 12, 20?
Кстати, может лучше хранить время начала и время окончания события?

Офлайн

#6 Дек. 11, 2012 02:25:17

Antonio051
От:
Зарегистрирован: 2011-01-06
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Выборка many-to-many

Нужно выводить события как у меня сейчас http://24events.ru/
(которые уже проходят и только начнутся)

Antonio051
В течении какого времени? Час, Два, Шесть, 12, 20?
Которые уже проходят в течении какого времени?
И только начнутся в течении какого времени?

Возьмите now:
- отнимите от now 1 час/2часа/40часов - это будет началом.
- прибавьте к now 1 час/2часа/40часов - это будет концом.
и сделайте выборку между этими датами.
https://docs.djangoproject.com/en/1.4/ref/models/querysets/#range




Офлайн

#7 Дек. 11, 2012 09:33:19

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка many-to-many

Спасибо! Сделал так:

def events(request, category=None):
    now = datetime.datetime.now()
    events = Event.objects.prefetch_related()
    if category:
        category = get_object_or_404(Category, uid=category)
        events = events.filter(category=category)
    events = events.filter(
        dates__date__range=(now, now + datetime.timedelta(days=365))
    ).order_by().distinct()

Почему-то distinct() не работает без order_by() ?!



Офлайн

#8 Дек. 12, 2012 02:07:18

Antonio051
От:
Зарегистрирован: 2011-01-06
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Выборка many-to-many

events = events.distinct().filter(
dates__date__range=(now, now + datetime.timedelta(days=365))
).order_by('XXXXX')
А по какому полю хотите отсортировать?



Офлайн

#9 Дек. 12, 2012 12:46:38

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка many-to-many

Если так:

events = events.distinct().filter(
        dates__date__range=(now, now + datetime.timedelta(days=365))
    ).order_by('dates__date')

то distinct не работает, записи дублируются



Офлайн

#10 Дек. 13, 2012 00:05:23

Antonio051
От:
Зарегистрирован: 2011-01-06
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

Выборка many-to-many

В оф доке по distinct написано, что использование вместе с order_by может привести к неожиданным результатам с дублированием записей. Попробуйте сначала сделать distinct, а потом отсортировать



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version