[파이썬] Peewee Many-to-Many through models 설정

In this blog post, we will explore how to set up Many-to-Many relationships with through models in Peewee, a lightweight and expressive ORM for Python.

Background

Many-to-Many relationships occur when multiple records in a table can correspond to multiple records in another table. In Peewee, we can define Many-to-Many relationships using an intermediary or “through” model. This through model helps establish the connection between the primary models involved in the relationship.

Setting up the models

Let’s say we have two models, User and Group. Each user can be a member of multiple groups, and each group can have multiple members. To represent this relationship, we will create a through model called Membership.

from peewee import *

database = SqliteDatabase('my_database.db')

class User(Model):
    username = CharField(unique=True)

class Group(Model):
    name = CharField(unique=True)

class Membership(Model):
    user = ForeignKeyField(User)
    group = ForeignKeyField(Group)

    class Meta:
        database = database

In the above example, we define the User, Group, and Membership models. Each Membership instance will have a foreign key reference to both the User and Group models.

Defining the Many-to-Many relationship

To set up the Many-to-Many relationship between the User and Group models, we will use the ManyToManyField field in the User model.

class User(Model):
    username = CharField(unique=True)
    groups = ManyToManyField(Group, through_model=Membership)

In the User model, we add the groups field of type ManyToManyField. We specify the Group model as the related table and the Membership model as the through model.

Querying the Many-to-Many relationship

Once the Many-to-Many relationship is established, we can easily query and access related records using Peewee’s ORM capabilities.

# Retrieve all groups a user is a member of
user = User.select().where(User.username == 'john').get()
groups = user.groups

# Retrieve all users in a group
group = Group.select().where(Group.name == 'developers').get()
members = group.user_set

With the above code snippets, we first retrieve the user or group of interest. Then, we use the groups or user_set attribute to access the related records.

Conclusion

Many-to-Many relationships are common in many database applications. By using Peewee’s through model functionality, we can easily define and query such relationships. This allows us to efficiently organize and retrieve data in complex scenarios involving multiple entities.

Peewee’s intuitive and expressive syntax simplifies the process of setting up and working with Many-to-Many through models, making it a powerful choice for Python developers.