在django模型中删除外键时会删除引用对象

时间:2016-11-23 18:22:35

标签: python django foreign-keys

我在django制作音频播放器。当我删除播放列表中的歌曲时,即使从乐曲数据库中删除了该歌曲。我想只从播放列表中删除歌曲,而不是从歌曲数据库中删除。但是如果歌曲从歌曲数据库中删除,则播放列表中的所有实例也应该被删除。

models.py

class Song(models.Model):
    song_title = models.CharField(max_length=250)
    file = models.FileField(upload_to='/',default = "null")
    class Meta:
        ordering = ['song_title']
    def __str__(self):
        return self.song_title

class Playlist(models.Model):
    name = models.CharField(max_length = 50)
    songs = models.ManyToManyField(Song)

    def __str__(self):
        return self.name

views.py

def deleteplaylistsong(request):
    if request.method == 'POST':
        song = (request.POST['song'])
        playlist = request.POST['playlist']
        s = Song.objects.get(song_title=song)
        p = Playlist.objects.get(name=playlist)
        p.songs.remove(s)
        return HttpResponse("success")

2 个答案:

答案 0 :(得分:0)

  1. 根据django documentation,当您执行obj.fkfield.remove(ref_obj)时,参照对象不会被删除。必须有一些额外的python代码(可能是m2m_changed信号),这些代码未在此处发布,并且会产生一些副作用。
  2. 删除Song对象后,Playlist个对象中对此项的所有引用都将自动删除。
  3. P.S。这种视图和模型听起来像是单元测试的完美案例。

答案 1 :(得分:-1)

完全删除PlaylistTrack模型;没有必要。在你看来做:

p.songs.remove(s)