Укажите поле внешнего ключа, которое должно быть исключено в ModelSerializer

Сначала позвольте мне рассказать вам о проблеме и моем решении. У меня есть модель с именем ProfileInfo, которая наследуется от абстрактных моделей PersonInfo и CompanyInfo. Каждая из этих абстрактных моделей имеет свои собственные сериализаторы (ModelSerializer), указывающие на ProfileInfo модели.

Предположим, что это поля компании, которые исключены из PersonInfoSerializer и наоборот.

Я добавил поле только для чтения is_filled, которое показывает, заполнена ли информация о профиле или нет:

class PersonInfoSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    is_filled = serializers.SerializerMethodField(allow_null=True)
    
    class Meta:
        model = ProfileInfo
        exclude = [
            "company_name",
            "company_tax_file",
        ]

    def get_is_filled(self, obj):
        data = obj.__dict__
        fields = data.keys() - set(self.Meta.exclude)
        is_filled = True
        for field in fields:
            if data[field] is None:
                is_filled = False
                break

        return is_filled
 

Ошибка, которую я получаю, гласит:

AssertionError: Поле 'company_tax_file_id' было включено в сериализатор PersonInfoSerializer в опции 'exclude', но не соответствует ни одному полю модели.

Обратите внимание, что company_tax_file является полем отношения FK в CompanyInfo и я хочу быть исключенным.

Как бы вы написали метод get_is_filled?

Вернуться на верх