On Sep 19, 2011, at 12:45 PM, Vlad K. wrote:
>
> Hi!
>
> I have a model, let's call it Resource. And another, let's call it Container.
> Each container can have any number of Resources, so they're in many-to-many
> relationship. What's worse, they're in "association object pattern"
> relationship because the association also carries the amount of particular
> Resource associated with teh Container.
>
> Now, when a Container is viewed I need to construct a (html) table listing
> ALL resources available (simple select all from resources), but ordered so
> that those resources that are in the container (amount > 0) are at the top
> (ordered desc), followed by the resources that are not in the container
> (implicitly amount = 0).
this is an ORDER BY derived from join. SQL would be like:
select * from resource left outer join container_to_resource on
resource.id=container_to_resource.resource_id and
container_to_resource.container_id=<my container id> order by
coalesce(container_to_resource.count, 0)
ORM:
Session.query(Resource).\
outerjoin(ResourcesInContainers.resource).\
filter(ResourcesInContainers.container_id=mycontainer.id).\
order_by(func.coalesce(ResourcesInContainers.amount, 0))
I'd stay away from UNION as they are awkward and rarely needed - only if you
have two disjoint selectables that really need to be in the same result.
>
> I figure I can do that the long way, selecting all the resources in a
> sequence, then for each apply an implicit attribute of amount obtained from
> another query, that of resources in this Container.
>
> But I assume there's the "right way" using UNION, (union of resources in the
> container with explicit amount, and all resources with implicit amount=0),
> and I am not sure how to proceed.
>
>
> class Container(Base):
> __tablename__ = "containers"
>
> container_id = ... # Integer
> name = ...
>
> resources = relationship("ResourcesInContainers")
>
>
> class Resource(Base):
> __tablename__ = ...
>
> resource_id = .... # Integer
> name ...
>
>
> class ResourcesInContainers(Base):
> __tablename__ = ...
>
> resource_id = Column(Integer, ForeignKey("resources.resource_id"),
> primary_key=True)
> container_id = Column(Integer, ForeignKey("containers.container_id",
> primary_key=True)
> amount = Column(SmallInteger)
>
> resource = relationship("Resource")
>
>
> I need to query resources' id, name and amount.
>
>
> Thanks!
>
>
> --
>
> .oO V Oo.
>
> --
> You received this message because you are subscribed to the Google Groups
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group at
> http://groups.google.com/group/sqlalchemy?hl=en.
>
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.