Marshmallow: Circular imports trouble

Created on 3 May 2019  Β·  2Comments  Β·  Source: marshmallow-code/marshmallow

Hello!

I would like to have structure of schemas separated by modules:
β”œβ”€β”€ serializers
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ analytic.py
β”‚Β Β  β”œβ”€β”€ portfolio.py
β”‚Β Β  └── user.py
β”‚ └── ....

Almost every Schema class use each other in nested fields. I can't solve circular imports issue with my structure. Is there a way to solve my problem or I must keep all classes in one module?

thank you!

question

All 2 comments

@deckar01 I've read documentation, this way doesn't work with my code structure!

I will show several examples

Number 1:

user.py

from serializers.base import BaseSerializer
from serializers.portfolio import PortfolioSerializer

class UserBaseSerializer(BaseSerializer):
    portfolios = fields.Nested(PortfolioSerializer, many=True, only=('id', 'type', 'balance'))

portfolio.py

from serializers.base import BaseSerializer
from serializers.user import UserBaseSerializer

class PortfolioSerializer(BaseSerializer):
    user = fields.Nested(UserBaseSerializer, only=('id', 'username', 'avatar_url'))
    type = EnumField(PortfolioTypeEnum)
    balance = fields.Decimal(as_string=True)

I got import Error

Number 2

Edit portfolio.py

from serializers.base import BaseSerializer

class PortfolioSerializer(BaseSerializer):
    user = fields.Nested('serializers.portfolio.UserBaseSerializer', only=('id', 'username', 'avatar_url'))
    type = EnumField(PortfolioTypeEnum)
    balance = fields.Decimal(as_string=True)

I got Error

Number 3

user.py

from serializers.base import BaseSerializer
from serializers.portfolio import PortfolioSerializer

class UserBaseSerializer(BaseSerializer):
    portfolios = fields.Nested('PortfolioSerializer', many=True, only=('id', 'type', 'balance'))

portfolio.py

from serializers.base import BaseSerializer
from serializers.user import UserBaseSerializer

class PortfolioSerializer(BaseSerializer):
    user = fields.Nested('UserBaseSerializer', only=('id', 'username', 'avatar_url'))
    type = EnumField(PortfolioTypeEnum)
    balance = fields.Decimal(as_string=True)

Again Error. What i'm doing wrong?

Was this page helpful?
0 / 5 - 0 ratings