Hi, all. I've been trying to modify the example of a composite association 
proxy 
(http://www.sqlalchemy.org/docs/orm/extensions/associationproxy.html#composite-association-proxies)
 
to fit my needs.

In the documentation example, there is a User object, a Keyword object, and 
a UserKeyword association object that stores a 'special_key' for each of a 
user's keywords. In the provided example, the result is a collection of 
dictionaries where the 'special_key' is the key and the 'keyword' is the 
value. I'm trying to inverse that mapping.

In my particular use case (which I've simplified so as to make it as clear 
as possible...I hope), I have a User object (a student), a Course object 
(an academic course), and a UserCourse association object that stores each 
user's grade for each course. My goal is to be able to set a student's 
grade something like this:

user.course['math'] = 100

This is what I've come up with, but it (obviously) isn't working yet.


from sqlalchemy import Column, Integer, Text, ForeignKey
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.orm import scoped_session, sessionmaker, relationship, 
backref


Base = declarative_base()


class User(Base):
    __tablename__ = 'users'

    # Columns
    id = Column(Integer, primary_key=True)
    name = Column(Text)

    # Relations
    courses = association_proxy(
        'user_courses',
        'course',
        creator=lambda k, v: UserCourse(course=k, grade=v)
        )

    def __init__(self, name):
        self.name = name


class Course(Base):
    __tablename__ = 'courses'

    # Columns
    id = Column(Integer, primary_key=True)
    title = Column(Text, unique=True)

    def __init__(self, title):
        self.title = title


# Composite association proxies linking users and preferences
class UserCourse(Base):
    __tablename__ = 'user_courses'

    # Columns
    user_id = Column(Integer, ForeignKey(User.id), primary_key=True)
    course_id = Column(Integer, ForeignKey(Course.id), primary_key=True)
    grade = Column(Integer)

    # Relations
    user = relationship(
        User,
        backref=backref(
            'user_courses',
            collection_class=attribute_mapped_collection('grade'),
            cascade='all, delete-orphan'
            )
        )
    c = relationship('Course')
    course = association_proxy('c', 'title')



I'd really appreciate anyone's help here, even if it's just showing me how 
to modify the example in the documentation.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to