DRF ImportError при круговом импорте сериализаторов - PullRequest
0 голосов
/ 14 февраля 2020

Я использую Django 2.2 и имею два приложения authentication и multi_users

Существует UserSerializer в authentication приложении. Модель multi_users имеет поле shared_user и, таким образом, использует UserSerializer в multi_users.serializers для сериализации поля shared_user.

Теперь в multi_users.serializers есть класс AccessLevelPermissionSerializer, который Мне нужно в authentication.serializers для сериализатора permissions пользователя.

Это выдаёт ошибку как

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',
        ]

Как решить эту проблему циклического импорта?

1 Ответ

0 голосов
/ 14 февраля 2020

Привет, может быть, это поможет, попробуйте удалить from authentication.serializers import UserBaseSerializer из multi_users.serializers, потому что, когда вы пытаетесь получить доступ к

from multi_users.serializers import AccessLevelPermissionSerializer

permissions = AccessLevelPermissionSerializer(required=False)

этому коду из authentication.serializer, вы находитесь в authentication.serializers пытаются получите доступ к from multi_users.serializers import AccessLevelPermissionSerializer, который перенаправит ваш вызов на multi_users.serializers, где вы снова импортируете из authentication.serializers. Импортируйте UserBaseSerializer, делая его круговым, находясь в этом файле, вы снова получаете доступ к другому файлу, который косвенно вызывает тот же файл, поэтому, пожалуйста, попробуйте удалить from authentication.serializers import UserBaseSerializer от multi_users.serializers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...