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
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