Relationships

Important caveat: Redis is by nature a key value data store. It is not a relational database like SQL. Therefore, Popoto may not be ideal for highly relational data because the query interface is very limited. Review the features below before using Relationship fields.

Relational Model

from popoto import Model, KeyField, Relationship

class Person(Model):
    name = KeyField()

class Group(Model):
    name = KeyField()

class Membership(Model):
    member = Relationship(model=Person)
    group = Relationship(model=Group)

Relationship Query


sally = Person.create(name="Sally")
friends = Group.create(name="My Line Friends")
Membership.create(member=sally, group=friends)

memberships = Membership.query.filter(member__name="Sally", group=friends_group)
print(memberships[0].member)
> Sally

When writing a query, start with the model you want returned and use filter params. In the above example, to get all the memberships of a group, use a query like this:

memberships = Membership.query.filter(group=friends_group)

To traverse relationships, use a list expansion like this:

friends = [m.person for m in Membership.query.filter(group=friends_group)]