简体   繁体   中英

DRF ImportError on importing serializers circular

I am using Django 2.2 and have two applications authentication and multi_users

There is UserSerializer in authentication application. The multi_users model has a field shared_user and thus using UserSerializer in the multi_users.serializers to serialize the shared_user field.

Now, there is AccessLevelPermissionSerializer class in the multi_users.serializers which I need in the authentication.serializers to serializer permissions of the user.

This is giving error as

ImportError: cannot import name 'AccessLevelPermissionSerializer' from 'multi_users.serializers' (/app/multi_users/serializers.py)

authentication.serializers

from authentication.models import Profile, User, Preference

class UserBaseSerializer(UserDetailsSerializer):
    class Meta(UserDetailsSerializer.Meta):
        fields = ('email', 'first_name', 'last_name')


class UserSerializer(UserBaseSerializer):
    from multi_users.serializers import AccessLevelPermissionSerializer

    permissions = AccessLevelPermissionSerializer(required=False)

    class Meta(UserDetailsSerializer.Meta):
        fields = UserBaseSerializer.Meta.fields + (
            'permissions'
        )

multi_users.serializers

from authentication.serializers import UserBaseSerializer

class SharedPermissionSerializer(serializers.ModelSerializer):
    class Meta:
        model = SharedPermission
        fields = [
            'code',
            'name',
        ]


class AccessLevelPermissionBaseSerializer(serializers.ModelSerializer):
    permission = SharedPermissionSerializer(required=False)

    class Meta:
        model = AccessLevelPermission
        fields = [
            'value',
            'permission'
        ]


# Import this in the `authentication.serializers`
class AccessLevelPermissionSerializer(AccessLevelPermissionBaseSerializer):
    pass


class MultiUserSerializer(serializers.ModelSerializer):

    shared_user = UserBaseSerializer(required=False)         # Use from `authentication.serializers`

    class Meta:
        model = MultiUser
        depth = 1
        fields = [
            'id',
            'shared_user',
            'access_level',
        ]

How to resolve this circular import issue?

Hi may be this will help , try to remove from authentication.serializers import UserBaseSerializer from multi_users.serializers because when you try to access

from multi_users.serializers import AccessLevelPermissionSerializer

permissions = AccessLevelPermissionSerializer(required=False)

this code from authentication.serializers, you being in authentication.serializers try to access from multi_users.serializers import AccessLevelPermissionSerializer which will redirect your call to multi_users.serializers where you are again importing from authentication.serializers import UserBaseSerializer which making it circular being in that file you again access another file which indirectly calling same file so please try to remove from authentication.serializers import UserBaseSerializer from multi_users.serializers

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM