LINUX.ORG.RU

Flask modify query


0

2

Как подменить query у class MyModel(db.Model)?

нужно на манер джанги переопределить query, вставив туда нужный фильтр, чтобы не набирать его каждый раз

ps: задача подставлять везде в админке domain_id и user_id, тем самым автоматически фильтруя объекты текущего домена и текущего пользователя

★★★

Последнее исправление: fMad (всего исправлений: 1)
Ответ на: комментарий от ggrn

а чем это отличается от неработающего у меня

class MyModel(db.Model):
    def query(self):
        return self.query.filter(domen_id==1)

AttributeError: 'function' object has no attribute 'filter_by'

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

есть код подобного в Django

class MultiDBModelAdmin(admin.ModelAdmin):

using = 'af3'

def queryset(self, request):
return super(MultiDBModelAdmin, self).queryset(request).using(self.using)

тут переопределяется queryset — настраивается на другую базу в рамках модуля

на Flaske нужно сделать тоже самое, только рамках домена, на HOST1 поступает запрос, фласк определяет номер этого домена, и для всех объектов Page переопределяет query, добавляя фильтр domen_id

fMad ★★★
() автор топика
Последнее исправление: fMad (всего исправлений: 2)
Ответ на: комментарий от Deleted

там sqlashema, просто обмотана по старинке

from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config')

db = SQLAlchemy(app)

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

вот типичная модель
[code]
class Page(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
# ататата
domen_id = db.Column(db.Integer, db.ForeignKey('domens.id'), default=0 )
[/code]

вот я её дёргаю во вьюшке

[code]
pages = models.Page.query.filter_by(domen_id=domen['id'])
[/code]

мне нужно переопределить models.Page.query так, чтобы .filter_by(domen_id=domen['id']) подставлялось автоматом везде

по-моему простейщая вещь, но вот чего то залип на ней

fMad ★★★
() автор топика
Последнее исправление: fMad (всего исправлений: 2)
Ответ на: комментарий от fMad

А domen['id'] откуда берётся? Это «string»? И почему всё-время автоматом? В коде нельзя так и оставить(q.filter_by(domen_id=X)), динамически фильтровать? В чём смысл автоматизма, если доменов-то несколько, динамика все-равно рано или поздно нужна будет.

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

допустим подключишь ты flask.admin и она будете тебе выдавать страницы со всех доменов и ото всех пользователей, а нужно что конкретный пользователь видел только свои страницы и желательно страницы текущего домена

а если переопределить query с нужными фильтрами, то и самодельные вьюшки и подключенные расширения будут выдавать то что нужно без всяких модификаций, в этом же прелесть ооп

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

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

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

не работает пример:

python2.7/site-packages/flask_sqlalchemy/__init__.py", line 162, in session_signal_before_commit
d = session._model_changes
AttributeError: 'Session' object has no attribute '_model_changes'

видимо это чей то ночной и страшный хардкор

что-то странное с этой схемой:

если переопределить query в Page

[code=Python]
class Page(db.Model):
def __init__(self):
self.query = self.query.filter_by(domen_id=0)
[/code]

то это работает, вот так

[code=Python]

from app.models import Page
p = Page()

__init__.Page

p.query.all()

[]
[/code]

но похоже ни где(в расширениях) явно не создаются объекты, а используются примерно вот так:
[code=Python]
pages = models.Page.query.order_by('date').limit(10)
[/code]

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

нашёл такое решение, но оно в рамках flask.ext.admin

[code=python]
class PageAdmin(sqla.ModelView):
# ататата
def get_query(self):
return super(PageAdmin, self).get_query().filter_by(domen_id={{домен_ид}})
[/code]

может есть ещё какие то варианты?

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

Мне думается, что если вам нужна гибкая админка, то просто нужно самому переписать flask.admin немного, а не лезть переопределять querry, которая должна подстраиваться под ваши запросы глобально. Querry по идее должна принадлежать какому-то manager'у, который заведует соединениями с БД и т.п., вроде, в джанге можно легко (относительно) писать свои manager'ы для ORM/querry патчинга. И то, на иностранных ресурсах я ни разу не видел, чтобы патчили именно querry - имхо, это не правильно, сразу вспоминается java с её «прелестями» всё расковырять и «override» :)

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

Он хочет, чтобы у него была админка для каждой группы пользователей своя. Типа, админы xxx.ru не могли лезть в настройки yyy.ru, если я правильно понял. Для этого у него пользователи и админы-пользователи все хранятся в одной таблице, но с разными атрибутами. Одним из атрибутов есть домен, по этому домену он хочет ограничивать одну группу админов от другой. Или я них. не понял, сорри.

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

1. на host1 приходит юзверь
2. фласк находит id этого хоста
3. мои вьюшки и вьюшки расширений обращаются к таблице страниц, в которой лежат страницы с кучи доменов и от кучи пользователей (и другие там всякие параметры(например — статус))
4. нужно как то переопределить модель страницы так, чтобы конкретный экземпляр, отбирал страницы связанные с текущим доменом и с текущим пользователей

вот переопределил get_query и sqla.ModelView, но это в контексте from flask.ext.admin

fMad ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.