Найти - Пользователи
Полная версия: Выборка many-to-many
Начало » Django » Выборка many-to-many
1 2
andreiru
Здравствуйте!

Делаю афишу

Модель такая:
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

правильно ли это или можно лучше ?
reclosedev
events.filter(dates__date__gte=now).distinct()
?
andreiru
reclosedev

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

А нужно вывести события которые уже проходят или только начнуться
Antonio051
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)

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

Antonio051
В течении какого времени? Час, Два, Шесть, 12, 20?
Кстати, может лучше хранить время начала и время окончания события?
Antonio051
Нужно выводить события как у меня сейчас 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


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

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() ?!
Antonio051
events = events.distinct().filter(
dates__date__range=(now, now + datetime.timedelta(days=365))
).order_by('XXXXX')
А по какому полю хотите отсортировать?
andreiru
Если так:

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

то distinct не работает, записи дублируются
Antonio051
В оф доке по distinct написано, что использование вместе с order_by может привести к неожиданным результатам с дублированием записей. Попробуйте сначала сделать distinct, а потом отсортировать
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB