app.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. from sqlalchemy.ext.associationproxy import association_proxy
  4. from sqlalchemy.orm import relationship, backref
  5. import flask_admin as admin
  6. from flask_admin.contrib import sqla
  7. # Create application
  8. app = Flask(__name__)
  9. # Create dummy secrey key so we can use sessions
  10. app.config['SECRET_KEY'] = '123456790'
  11. # Create in-memory database
  12. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
  13. app.config['SQLALCHEMY_ECHO'] = True
  14. db = SQLAlchemy(app)
  15. # Flask views
  16. @app.route('/')
  17. def index():
  18. return '<a href="/admin/">Click me to get to Admin!</a>'
  19. class User(db.Model):
  20. __tablename__ = 'user'
  21. id = db.Column(db.Integer, primary_key=True)
  22. name = db.Column(db.String(64))
  23. # Association proxy of "user_keywords" collection to "keyword" attribute - a list of keywords objects.
  24. keywords = association_proxy('user_keywords', 'keyword')
  25. # Association proxy to association proxy - a list of keywords strings.
  26. keywords_values = association_proxy('user_keywords', 'keyword_value')
  27. def __init__(self, name=None):
  28. self.name = name
  29. class UserKeyword(db.Model):
  30. __tablename__ = 'user_keyword'
  31. user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
  32. keyword_id = db.Column(db.Integer, db.ForeignKey('keyword.id'), primary_key=True)
  33. special_key = db.Column(db.String(50))
  34. # bidirectional attribute/collection of "user"/"user_keywords"
  35. user = relationship(User, backref=backref("user_keywords", cascade="all, delete-orphan"))
  36. # reference to the "Keyword" object
  37. keyword = relationship("Keyword")
  38. # Reference to the "keyword" column inside the "Keyword" object.
  39. keyword_value = association_proxy('keyword', 'keyword')
  40. def __init__(self, keyword=None, user=None, special_key=None):
  41. self.user = user
  42. self.keyword = keyword
  43. self.special_key = special_key
  44. class Keyword(db.Model):
  45. __tablename__ = 'keyword'
  46. id = db.Column(db.Integer, primary_key=True)
  47. keyword = db.Column('keyword', db.String(64))
  48. def __init__(self, keyword=None):
  49. self.keyword = keyword
  50. def __repr__(self):
  51. return 'Keyword(%s)' % repr(self.keyword)
  52. class UserAdmin(sqla.ModelView):
  53. """ Flask-admin can not automatically find a association_proxy yet. You will
  54. need to manually define the column in list_view/filters/sorting/etc.
  55. Moreover, support for association proxies to association proxies
  56. (e.g.: keywords_values) is currently limited to column_list only."""
  57. column_list = ('id', 'name', 'keywords', 'keywords_values')
  58. column_sortable_list = ('id', 'name')
  59. column_filters = ('id', 'name', 'keywords')
  60. form_columns = ('name', 'keywords')
  61. class KeywordAdmin(sqla.ModelView):
  62. column_list = ('id', 'keyword')
  63. # Create admin
  64. admin = admin.Admin(app, name='Example: SQLAlchemy Association Proxy', template_mode='bootstrap3')
  65. admin.add_view(UserAdmin(User, db.session))
  66. admin.add_view(KeywordAdmin(Keyword, db.session))
  67. if __name__ == '__main__':
  68. # Create DB
  69. db.create_all()
  70. # Add sample data
  71. user = User('log')
  72. for kw in (Keyword('new_from_blammo'), Keyword('its_big')):
  73. user.keywords.append(kw)
  74. db.session.add(user)
  75. db.session.commit()
  76. # Start app
  77. app.run(debug=True)