Как разместить данные во вложенном сериализаторе в Django rest framework

Я работаю над приложением и мне нужна помощь Я хочу аутентифицировать LinkedIn и сохранить токен доступа в таблице, а затем собрать данные пользователя LinkedIn в другой таблице Ниже приведен мой model.py


class LinkedInUserCode(models.Model):
    """
    Credentials for the user to give access to LinkedIn.
    """
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    token = models.CharField(max_length=1024)
    expires_in = models.IntegerField()
    


    def __str__(self):
        return f'{self.token}' 

    class Meta:
        db_table = 'linkedin_user_code'
        verbose_name_plural = "LinkedIn User Codes"

class LinkedInProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    linkedin_id = models.CharField(max_length=1024, blank=True, null=True)
    first_name = models.CharField(max_length=1024, blank=True, null=True)
    last_name = models.CharField(max_length=1024, blank=True, null=True)
    profile_image_url = models.CharField(max_length=1024, blank=True, null=True)
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    

    def __str__(self):
        return f'{self.linkedin_id}'
    
    class Meta:
        db_table = 'linkedin_profile'
        verbose_name_plural = "LinkedIn Profiles"

Я использую вложенный сериализатор и это мой сериализатор

class LinkedInProfileSerializer(ModelSerializer):
    """
    Serializer for the LinkedInProfile model.
    """
    id = IntegerField(required=False)
    user = ReadOnlyField(source='user.email')
    linkedin_access = ReadOnlyField(source='linkedin_access.token')
    class Meta:
        model = LinkedInProfile
        fields = '__all__'

    def create(self, validated_data):
        """
        Create a new LinkedInProfile instance.
        """
        return LinkedInProfile.objects.create(**validated_data)
    
    def update(self, instance, validated_data):
        instance.linkedin_id = validated_data.get('linkedin_id')
        instance.first_name = validated_data.get('first_name')
        instance.last_name = validated_data.get('last_name')
        instance.profile_image_url = validated_data.get('profile_image_url')
        instance.linkedin_access = validated_data.get('linkedin_access')
        instance.save()
        return instance

class LinkedInUserCodeSerializer(ModelSerializer):
    user = ReadOnlyField(source='user.email')
    profiles = LinkedInProfileSerializer(many=True, read_only=True)

    class Meta:
        model = LinkedInUserCode
        fields = ['user', 'token', 'expires_in', 'profiles']

    def create(self, validated_data):
        """ Create and return necessary credentials for linkedin."""
        profile = validated_data.pop('profiles')
        access_token = LinkedInUserCode.objects.create(**validated_data)
        for profile_data in profile:
            LinkedInProfile.objects.create(linkedin_access=access_token, **profile_data)
        return access_token
    
    def update(self, instance, validated_data):
        profiles = validated_data.pop('profiles')
        instance.token = validated_data.get('token', instance.token)
        instance.expires_in = validated_data.get('expires_in', instance.expires_in)
        instance.save()
        temp_profile = []
        existing_ids = [profiles.get('linkedin_id') for profile in instance.profiles.all()]
        for profile_data in profile:
            if profile_data.get('linkedin_id') in existing_ids:
                temp_profile.append(LinkedInProfile.objects.get(linkedin_id=profile_data.get('linkedin_id')))
            else:
                temp_profile.append(LinkedInProfile.objects.create(linkedin_access=instance, **profile_data))
                instance.profiles.set(temp_profile)
        for profile in instance.profiles.all():
            if profile not in temp_profile:
                profile.delete()
        return instance

Я написал скрипт, который я использую для выполнения запросов к LinkedIn api и вот мое представление Я хочу заполнить его сразу Любая идея, как я могу пойти об этом Я продолжаю иметь проблемы с внешним ключом LinkedIn_access

class LinkedInCallbackAPIView(APIView):
    """
        This View is used to get and save the Access Token from LinkedIn authorization page.
    """  
    def get(self, request, *args, **kwargs):
        response = request.GET
        if response is not None and state != response.get('state'):
            return Response({'error': "Invalid state"}, status=status.HTTP_401_UNAUTHORIZED)
        else:
           
            queryset = LinkedInUserCode.objects.filter(user=request.user)
            code = response.get('code')
            access_token = linkedin.get_access_token(code)
            profile = linkedin.get_user_profile(access_token.get('access_token'))
            profile = {
                'linkedin_id': profile.get('id'),
                'first_name': profile.get('firstName').get('localized').get('en_US'),
                'last_name': profile.get('lastName').get('localized').get('en_US'),
                'profile_image_url': profile.get('profilePicture').get('displayImage'),
            }
            data = {
                'token': access_token.get('access_token'),
                'expires_in': access_token.get('expires_in'),
                'user': request.user,
                'profiles': profile,
            }
            serializer = LinkedInUserCodeSerializer(data=data)
            if queryset.exists():
                serializer.update(queryset.first(), data)
                return Response({'message': 'Your LinkedIn user Access Token was Updated'},status=status.HTTP_200_OK)
            if serializer.is_valid():
                serializer.save(**data)
# there will be a return response here 

Мне нужна помощь в передаче этой таблицы, а не в использовании одной таблицы для нее

спасибо

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