LINUX.ORG.RU

Не хотят фильтроваться элементы из связанной таблицы

 , ,


0

1

ЛОР, помоги, я сжёг все силы и не понял. Тут нужен настоящий программист.

Есть две таблицы, связанные отношением many-to-many. Типа люди и типа события. Определено, минимально, так:

class Contact(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    meetings = db.relationship(
        'Event', secondary=events, order_by="desc(Event.id)",
        backref=db.backref('participants', lazy='dynamic'), lazy='dynamic')

class Event(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    deleted = db.Column(db.Boolean, default=False, nullable=False)
    date = db.Column(db.DateTime, default=datetime.utcnow)

Собирался сделать страницу, которая будет показывать все события для одного человека. Соответственно, берём человека и отправляем рендериться в шаблон:

    contact = Contact.query.filter_by(id=contact_id).first_or_404()
    return render_template('events.html', contact = contact)

В шаблоне из человека вытаскиваются его события и циклом вываливаются на страницу:

{% for meeting in contact.meetings %}
	<p>{{ meeting.id}} - {{ meeting.date }}</p>
{% endfor %}

Это всё в первом приближении работает прекрасно. Так же прекрасно работает, если я фильтрую события по признаку «не удалены»:

{% for meeting in contact.meetings.filter_by(deleted=False) %}
# Перфекто

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

  1. Взять проверенный .filter_by(), которым я вроде научился пользоваться. Но я не знаю, как попросить его сделать NOT NULL. Попытки типа date!=None или date>0 приводят к разнообразным эксепшонам и всё.
  2. Взять .filter(), в котором вроде бы всё можно. Но я не могу объяснить ему, что такое date; на .filter(date.is_(None)) он упорно утверждает, что не знает такую переменную. Советы на SO настолько не похожи на мой код, что для их примения нужно переписать программу, поменять фреймворк, выучить другой язык, сметить пол и улететь на другую планету.

Не могу больше думать, спасите.

ЗЫ Если где соврал, то не со зла, просто тысячу вариантов уже перепробовал.

★★★★

Последнее исправление: muon (всего исправлений: 1)

события по наличию даты

ну во первых, для чего тебе такой фильтр, если у тебя дата всегда есть? или ты не так выразился?

ну а во вторых, оно, наверняка, возвращает объект и тебе нужно сравнивать его с таким же объектом.

.filter(Event.date > object)

ну как вариант.

usi_svobodi
()
Ответ на: комментарий от usi_svobodi

если у тебя дата всегда есть

Нет, не всегда. Например, она может быть ещё не назначена. Это валидное состояние, оно нужно.

ну а во вторых, оно, наверняка, возвращает объект

.filter(Event.date > object)

Да, видимо, фильтру надо как-то объяснить, что речь идёт о свойстве неких объектов. Но я не знаю как. Эти объекты не передаются в шаблон в переменной, массивом или ещё как-то. Передаётся только переменная contact, а события подтягиваются через связь таблиц. Поэтому если пытаться использовать Event.date, то

jinja2.exceptions.UndefinedError: 'Event' is undefined
muon ★★★★
() автор топика
Ответ на: комментарий от muon

обработай данные и передай их в нужном в виде в шаблон. не надо их фильтровать внутри шаблонов. в шаблон можешь просто передавать готовые словари и с ними уже работать.

usi_svobodi
()
Ответ на: комментарий от usi_svobodi

Тоже пришёл к такому выводу. Заманчиво было передать один объект, а дальше оно само разберётся. Но не вышло. Да и шаблон с обилием кода становится подозрительно похож на PHP.

muon ★★★★
() автор топика
Ответ на: комментарий от muon

Заманчиво было передать один объект, а дальше оно само разберётся.

потом многие начинают негодовать, а че это сайты на питоне такие медленные.

не нужно делать никаких запросов из шаблонов.

usi_svobodi
()
Ответ на: комментарий от usi_svobodi

Нууу, я не уверен, что расположение питоновского кода в том или другом файле может замедлить или ускорить выполнение. Чувак в своём учебнике по фласку именно так и делает, только без фильтрации.

muon ★★★★
() автор топика
Последнее исправление: muon (всего исправлений: 1)