[파이썬] Peewee Hybrid attributes 작성

Peewee is a lightweight Python ORM (Object Relational Mapping) library that makes it easy to interact with databases. One powerful feature of Peewee is its hybrid attributes. Hybrid attributes allow you to define custom properties on your model that can derive their values from other model attributes or perform custom calculations.

In this blog post, we will explore how to write and use hybrid attributes in Peewee.

Defining a Hybrid Attribute

To define a hybrid attribute, you need to create a method within your model class and decorate it with the @hybrid_property decorator provided by Peewee. Let’s write a simple example of a hybrid attribute that calculates the total price of a product based on its unit price and quantity.

from peewee import Model, DecimalField
from peewee import SqliteDatabase
from peewee import hybrid_property

db = SqliteDatabase('products.db')

class Product(Model):
    name = CharField()
    unit_price = DecimalField()
    quantity = IntegerField()

    @hybrid_property
    def total_price(self):
        return self.unit_price * self.quantity

    class Meta:
        database = db

In the above code, we define a Product model with attributes name, unit_price, and quantity. We then define a total_price hybrid attribute that calculates the total price by multiplying the unit_price and quantity together.

Using a Hybrid Attribute

Once the hybrid attribute is defined, you can use it just like any other attribute on your model.

# Create a new product
product = Product.create(name='Example Product', unit_price=10.99, quantity=5)

# Access the hybrid attribute
print(product.total_price)  # Output: 54.95

In the above example, we create a new Product object and access its total_price hybrid attribute. Peewee will automatically calculate the total price based on the provided unit_price and quantity values.

Using a Hybrid Attribute in Queries

One of the great features of Peewee hybrid attributes is that they can also be used in queries. This allows you to perform advanced calculations or filtering based on the derived values.

# Find all products with a total price greater than $50
expensive_products = Product.select().where(Product.total_price > 50)

for product in expensive_products:
    print(product.name)

# Output: Example Product

In the above example, we use the total_price hybrid attribute in a query to find all products with a total price greater than $50. This can be useful in scenarios where you want to filter and retrieve specific records based on custom calculations.

Conclusion

Hybrid attributes in Peewee provide a powerful mechanism to define custom properties on your models that can derive their values from other attributes or perform complex calculations. They can be used just like regular attributes and are even queryable, making them a versatile tool in your Peewee ORM toolkit.

Try using hybrid attributes in your next Peewee project to enhance your models with advanced functionality and calculations.