pythondjangobackend

ValueError when i migrate in my Django project


I'm trying to make a music streaming website using Django. I have this error when i use the terminal command "migrate": "ValueError: Field 'song_id' expected a number but got '' ". I don't understand where "song_id" take a value that is not a number. How can i fix it and what is the code line with the problem? this is my views.py:

def myPlaylist(request, id):
user = request.user
if user.is_authenticated:
    # Extracting Playlists of the Authenticated User
    myPlaylists = list(Playlist.objects.filter(user=user))
if user.is_authenticated:
    if request.method == "POST":
        song_id = request.POST["music_id"]
        playlist = Playlist.objects.filter(playlist_id=id).first()
        if song_id in playlist.music_ids:
            playlist.music_ids.remove(song_id)
            playlist.plays -= 1
            playlist.save()
        message = "Successfull"
        print(message)
        return HttpResponse(json.dumps({'message': message}))
    else:
        images = os.listdir("music_app/static/PlaylistImages")
        print(images)
        randomImagePath = random.choice(images)
        randomImagePath = "PlaylistImages/" + randomImagePath
        print(randomImagePath)
        currPlaylist = Playlist.objects.filter(playlist_id=id).first()
        music_ids = currPlaylist.music_ids
        playlistSongs = []
        recommendedSingers = []
        for music_id in music_ids:
            song = Song.objects.filter(song_id=music_id).first()
            random.shuffle(recommendedSingers)
            recommendedSingers = list(set(recommendedSingers))[:6]
            playlistSongs.append(song)

        return render(request, "myPlaylist.html", {'playlistInfo': currPlaylist,
                                                       'playlistSongs': playlistSongs,
                                                       'myPlaylists': myPlaylists,
                                                       'recommendedSingers': recommendedSingers,
                                                       'randomImagePath': randomImagePath})
def addSongToPlaylist(request):
user = request.user
if user.is_authenticated:
    try:
        data = request.POST['data']
        ids = data.split("|")
        song_id = ids[0][2:]
        playlist_id = ids[1][2:]
        print(ids[0][2:], ids[1][2:])
        currPlaylist = Playlist.objects.filter(playlist_id=playlist_id).first()
        if song_id not in currPlaylist.music_ids:
            currPlaylist.music_ids.append(song_id)
            currPlaylist.plays = len(currPlaylist.music_ids)
            currPlaylist.save()
        return HttpResponse("Successfull")
    except:
        return redirect("/")
    # return redirect("/")
else:
    return redirect("/")

def likesong(request):
myPlaylists = []
try:
    # print("Request Submitted Successfully!!!")
    user = request.user
    if user.is_authenticated:
        # Extracting Playlists of the Authenticated User
        myPlaylists = list(Playlist.objects.filter(user=user))
    if user.is_authenticated:
        if request.method == "POST":
            song_id = request.POST["music_id"]
            isPresent = False
            if LikedSong.objects.filter(user=user, music_id=song_id).exists():
                isPresent = True

            if isPresent:
                LikedSong.objects.filter(user=user, music_id=song_id).delete()
                # print(f"Your song is removed from the liked song id: {song_id}")
            else:
                like = LikedSong(user=user, music_id=song_id)
                like.save()
                # print(f"Your song successfully added id: {song_id}")
            message = "Successfull"
            return HttpResponse(json.dumps({'message': message}))
        else:
            like = LikedSong.objects.filter(user=user)
            ids = []
            for i in like:
                ids.append(i.music_id)
            preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(ids)])
            likedSongs = Song.objects.filter(song_id__in=ids).order_by(preserved)
            return render(request, "likedSong.html", {'likedSongs': likedSongs})
    else:
        # print("User is not authenticated")
        return redirect("/")
except:
    return redirect("/")

and this is my models.py:

class Song(models.Model):
song_id = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
artist = models.CharField(max_length=50)
album = models.CharField(max_length=50, blank=True)
song = models.FileField(upload_to="media/songs/", validators=[FileExtensionValidator(allowed_extensions=['mp3', 'wav'])], default="name")
image = models.ImageField(upload_to="media/songimage/", validators=[FileExtensionValidator(allowed_extensions=['jpeg', 'jpg', 'png'])], default="https://placehold.co/300x300/png")
data = models.DateTimeField(auto_now=False, auto_now_add=True)
slug = models.SlugField()

def __str__(self):
    return self.name

class Meta:
    ordering = ['name']


class Playlist(models.Model):
    playlist_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=50, default="name")
    image = models.ImageField(upload_to="media/images/", validators=[FileExtensionValidator(allowed_extensions=['jpeg', 'jpg', 'png'])])
    slug = models.SlugField()

    def __str__(self):
        return self.user.first_name


class LikedSong(models.Model):
    liked_id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    music_id = models.CharField(max_length=50, default="name")

    def __str__(self):
        return self.user.first_name

Solution

  • The problem was the old migrations. I deleted migrations files (ex. 00XX_*.py) (NEVER delete applied migration files if you want to keep data! and don't remove the directory and init.py), i reset the DB (if you are using sqlite you can easily delete the sqlite file) and makemigrations again