将“重复的”对象添加到Django

时间:2019-05-11 14:29:32

标签: django django-models django-forms

我有一个叫做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方法相同的结果。

1 个答案:

答案 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)字段,因此可以将其删除。