0

I am trying to write a view/SQLAlchemy query that will allow me to display data thats linked as a ForeignKey and also where I have a ManyToMany relationship

have the models..

#Samples
class Sample(Base):
    __tablename__ = 'samples'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode)

    def __unicode__(self):
        return self.name

samples_to_customer = Table('samples_to_customer', Base.metadata,
  Column('customer_id', Integer, ForeignKey('customer.id')),
  Column('sample_id', Integer, ForeignKey('samples.id'))
  )

#Create a cusotmer model to store customer numbers
class Customer(Base):
    __tablename__ = 'customer'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode, unique=True) #this will be the variable used to search the existing db
    customer_samples = relationship('Sample', secondary='samples_to_customer', backref='samples')
    sales_rep = Column(Integer, ForeignKey('rep.id'))
    Rep = relationship('Rep')

    def __unicode__(self):
        return self.name

# This model will have its own entry view/page a user logs on and enters notes (according to a customer
# number) they then get stored/saved onto the Customers account
class Note(Base):
    __tablename__ = 'note'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode)
    pub_date = Column(Date)
    customer_no = Column(Integer, ForeignKey('customer.id'))
    customer = relationship('Customer')

    def __unicode__(self):
        return self.name

And the views..

@view_config(route_name='view_customer', renderer='templates/view_customer.jinja2')
def view_page(request):
    customer_no = request.matchdict['customer']
    cust_slcustm = DBSessionRO.query(Slcustm).filter(Slcustm.customer == customer_no).first()
    cust_customer = DBSessionRO.query(Custom).filter(Custom.cu_custref== customer_no).first()

    # Return a 404 if a result isn't found, slcustm and customer share one2one relationship on customer_no
    if cust_slcustm is None:
        return HTTPNotFound('No such customer')

    return dict(cust_slcustm=cust_slcustm, cust_customer=cust_customer)  

But I cant seem to write a query that will display every sample and note related to a customer number? If anyone could help I would be very grateful :)

2
  • 1
    It's better if you could put your code here ;) Commented Mar 9, 2012 at 16:37
  • 2
    What have you tried? What worked, what didn't? Did you get an error? Did you get the wrong data? Commented Mar 9, 2012 at 16:58

2 Answers 2

1

Try this

class Note(Base):
    __tablename__ = 'note'
    id = Column(Integer, primary_key=True)
    name = Column(Unicode)
    pub_date = Column(Date)
    customer_no = Column(Integer, ForeignKey('customer.id'))
    customer = relationship('Customer', backref='notes')

@view_config(route_name='view_customer', renderer='templates/view_customer.jinja2')
def view_page(request):
    customer_no = request.matchdict['customer']
    cust = DBSessionRO.query(Customer).filter(Customer.id == customer_no).first()

    print "Sample :", cust.customer_sample
    print "Notes :", cust.notes
Sign up to request clarification or add additional context in comments.

1 Comment

The backref helped me with another struggle I was having, thanks! :)
1

What ended up working was:

#views.py
@view_config(route_name='view_customer', renderer='templates/view_customer.jinja2')
def view_page(request):
    customer_no = request.matchdict['customer']
    cust_slcustm = DBSessionRO.query(Slcustm).filter(Slcustm.customer == customer_no).first()
    cust_customer = DBSessionRO.query(Custom).filter(Custom.cu_custref== customer_no).first()
    cust_books = DBSessionRW.query(Customer).filter(Customer.name == customer_no).first()

    # Return a 404 if a result isn't found, slcustm and customer share one2one relationship on customer_no
    if cust_slcustm is None:
        return HTTPNotFound('No such customer')

    return dict(cust_slcustm=cust_slcustm, cust_customer=cust_customer, cust_books=cust_books)   

Then creating the template:

{% for sample in cust_books.customer_samples %}
  {{ sample.name }}
{% endfor %}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.