我有一个叫做Song的模型和另一个叫做Chord的模型。他们通过称为ChordIndex的标签具有ManyToMany关系。
一首歌曲可能需要多次具有相同的和弦,而django不允许这样做。因此,我为模型提供了一个称为索引的额外字段(手动编码的自动增量字段),因此对象并不相同。
仍然无法添加“重复”和弦。
尽管如此,该方法适用于表单和POST方法。但是,如果我使用POST方法,则无法将歌曲字段设置为default =“ lastSongByUser”,因为您只能在视图内查询“ user”。
models.py
class ChordIndex(models.Model):
def incrementalNumber():
objectCount = ChordIndex.objects.count()
if objectCount == None:
return 2
else:
return objectCount + 1
index = models.PositiveIntegerField(default=incrementalNumber)
chord = models.ForeignKey('Chord', on_delete=models.CASCADE)
song = models.ForeignKey('Song', on_delete=models.CASCADE)
views.py
def addchord_view(request, idChord):
user = request.user.profile
chord = Chord.objects.get(pk=idChord)
songsByUser = Song.objects.filter(uploader=user)
lastSongByUser = songsByUser.last()
previousPage = request.META.get('HTTP_REFERER')
filterUserLastSong = ChordIndex.objects.filter(song=lastSongByUser)
lastSongByUser.chords.add(chord)
thisObjectAdded = filterUserLastSong.last()
thisObjectAdded.save()
return HttpResponseRedirect(previousPage)
editchords.html
{% for chord in allChords %}
{% if chord.acronym != silent%}
<button class="btn btn-dark"><a href="{% url 'add-chord-view' idChord=chord.pk %}">{{ chord.acronym }}</a></button>
{% else %}
<button class="btn btn-primary"><a class="text-dark" href="{% url 'add-chord-view' idChord=chord.pk %}">next part</a></button>
{% endif %}
{% endfor %}
我希望获得与POST方法相同的结果。
答案 0 :(得分:1)
您可以添加重复的对象,如下所示:
def addchord_view(request, idChord):
user = request.user.profile
chord Chord.objects.get(pk=idChord)
songsByUser = Song.objects.filter(uploader=user)
lastSongByUser = songsByUser.last()
previousPage = request.META.get('HTTP_REFERER')
filterUserLastSong = ChordIndex.objects.create(song=lastSongByUser, chord=chord)
return HttpResponseRedirect(previousPage)
调用ChordIndex.objects.create(song=lastSongByUser, chord=chord)
时,它将创建一个新的ChordIndex
实例。然后,如果您呼叫song.chords.all()
,则对于按照创建顺序排列的歌曲,应该获得多个和弦。您无需在模型中也使用index = models.PositiveIntegerField(default=incrementalNumber)
字段,因此可以将其删除。