[파이썬] Peewee Model-to-Model 관계

Peewee is a lightweight Python ORM (Object Relational Mapper) that makes it easy to work with databases using Python. One powerful feature of Peewee is the ability to define model-to-model relationships, allowing you to establish connections between different database tables.

In this blog post, we will explore how to define and work with model-to-model relationships in Peewee using the Python programming language. We will cover the two most common relationship types: one-to-many and many-to-many.

One-to-Many Relationship

A one-to-many relationship is a scenario where one record in a table is associated with multiple records in another table. Let’s consider a simple example of a User model and a Post model, where each user can have multiple posts:

from peewee import *

database = SqliteDatabase('my_db.db')

class User(Model):
    name = CharField()

    class Meta:
        database = database

class Post(Model):
    title = CharField()
    content = TextField()
    user = ForeignKeyField(User, backref='posts')

    class Meta:
        database = database

In this example, we have defined two models: User and Post. The User model represents a user, and the Post model represents a post made by a user. The Post model has a foreign key field user that references the User model.

To establish a one-to-many relationship, we define the foreign key field in the child model (Post) with ForeignKeyField, specifying the parent model (User) and using the backref argument to create a reverse relationship from User to Post (i.e., each User has a posts attribute).

With this relationship, we can easily access and manipulate the associated posts for a user:

# Create a new user and posts
user = User.create(name='John Doe')
post1 = Post.create(title='Hello World', content="This is my first post!", user=user)
post2 = Post.create(title='Second Post', content="This is my second post!", user=user)

# Get all posts by a user
user_posts = user.posts
for post in user_posts:
    print(post.title)

# Get the user who made a post
post = Post.get(title='Hello World')
post_author = post.user
print(post_author.name)

Many-to-Many Relationship

A many-to-many relationship is a scenario where multiple records in one table are associated with multiple records in another table. To illustrate this, let’s consider a Tag model and a Post model, where each post can have multiple tags, and each tag can be associated with multiple posts:

class Tag(Model):
    name = CharField()

    class Meta:
        database = database

class Post(Model):
    title = CharField()
    content = TextField()
    tags = ManyToManyField(Tag, backref='posts')

    class Meta:
        database = database

To establish a many-to-many relationship, we use the ManyToManyField in the child model (Post), specifying the related model (Tag) and using the backref argument to create a reverse relationship from Tag to Post (i.e., each Tag has a posts attribute).

Here’s how we can work with the many-to-many relationship:

# Create tags and a post
tag1 = Tag.create(name='Python')
tag2 = Tag.create(name='Django')
post = Post.create(title='Peewee Model-to-Model', content='Working with relationships in Peewee')
post.tags.add([tag1, tag2])

# Get all tags associated with a post
post_tags = post.tags
for tag in post_tags:
    print(tag.name)

# Get all posts associated with a tag
tag = Tag.get(name='Python')
tag_posts = tag.posts
for post in tag_posts:
    print(post.title)

By using the ManyToManyField and backref arguments in Peewee, we can easily establish and navigate between model-to-model relationships in our database applications.

Peewee provides a powerful and intuitive way to work with databases in Python, making it a great choice for developers looking for a lightweight and flexible ORM solution.

I hope this blog post has provided you with a good understanding of how model-to-model relationships can be implemented and utilized in Peewee. Happy coding!