"<Модель: ModelInstance>" должно иметь значение для поля "id", прежде чем можно будет использовать это отношение "многие-ко-многим".
В настоящее время я получаю эту ошибку между моей моделью UserProfile и моделью Song, когда пытаюсь получить все песни пользователя "song = user_prof.songs.all()" и ошибка имеет заголовок "<UserProfile: ...>". Я впервые использую сквозную модель для двух моделей (Song и Note) и у меня есть подозрения. Экземпляры UserProfile, Song, Notes и SongNotes сохраняются и доступны для просмотра в админке django, однако экземпляр song_instance не показывает никаких заметок, более того, он даже не показывает свое поле заметок, как я предполагаю, из-за сквозной модели.
Просмотр песни
class Songs(APIView):
def post(self, request, format=None):
try:
data = self.request.data
user_song = data['song']
name = data['name']
user = self.request.user
user_prof = UserProfile.objects.get(user=user)
song_instance = Song.objects.create(name=name)
user_prof.songs.add(song_instance)
user_prof.save()
for index, pair in enumerate(user_song):
note = Note.objects.create(note=pair[0], timestamp=pair[1])
song_note_through = SongNote.objects.create(song=song_instance, note=note, order=index)
song_instance.save()
return Response({ 'success': 'Song created' })
except Exception as e:
print('Songs:post ', e, file=sys.stderr)
return Response({ 'error': 'Unable to create song' })
def get(self, request, id='all', format=None):
try:
if id == 'all':
user = self.request.user
user_prof = UserProfile(user=user)
song = user_prof.songs.all()
else:
song = Song.objects.get(id=id)
serializer = SongSerializer(song)
return Response({ 'song': serializer.data})
except Exception as e:
print('Songs:get ', e, file=sys.stderr)
return Response({ 'error': 'Unable to get song' })
models.py
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=255, default='')
last_name = models.CharField(max_length=255, default='')
posts = models.ManyToManyField('Post', blank=True, related_name='created_post')
songs = models.ManyToManyField('Song', blank=True)
class Song(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=100)
notes = models.ManyToManyField('Note', through='SongNote', blank=True)
class Note(models.Model):
note = models.CharField(max_length=500)
timestamp = models.IntegerField(default=0)
class SongNote(models.Model):
song = models.ForeignKey(Song, on_delete=models.CASCADE)
note = models.ForeignKey(Note, on_delete=models.CASCADE)
order = models.IntegerField()
class Meta:
ordering = ['order']
Я некоторое время искал информацию. Есть еще одна почта с этим вопросом, однако она не помогла. Большинство предположений сводится к тому, что я не сохраняю модель Song перед доступом к ее атрибутам, но я вижу, что они есть в панели администратора.