我有一个带JavaScript的html表,该表允许对行进行排序,该行通过POST上的表单传递track_id列表和行顺序列表。
我只是在模型中添加了通过使用的PlaylistTrack类,因此可以在tracks.m2m字段中添加排序。在添加直通模型之前,下面的视图起作用了,但是现在我不确定如何保存带有相关订单号的轨道列表,因为我不能使用add(),而必须使用create()。如何在我的视图中使用create()保存track_id的列表并关联带有列表的订单号?我可以使用bulk_create吗?
models.py:
class Playlist(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1)
name = models.CharField(max_length=50)
tracks = models.ManyToManyField(Track, through='PlaylistTrack')
def __str__(self):
return self.name
class PlaylistTrack(models.Model):
track = models.ForeignKey(Track)
playlist = models.ForeignKey(Playlist)
order = models.PositiveIntegerField()
class Meta:
ordering = ['order']
views.py:
def add_track(request):
active_playlist = Playlist.objects.get(id=request.POST.get('playlist_id'))
add_tracks = request.POST.getlist('track_id')
if request.POST.get('playlist_id'):
active_playlist.tracks.add(*add_tracks) # how to use create or bulk_create?
return redirect("playlists:list_playlists")
Ozgur的答案基本涵盖了您。但是,您不需要从数据库中获取数据Playlist
或Track
实例,则可以使用bulk_create
:
def add_track(request):
playlist_id = request.POST.get('playlist_id')
track_ids = enumerate(request.POST.getlist('track_id'), start=1)
PlaylistTrack.objects.bulk_create([
PlaylistTrack(playlist_id=playlist_id, track_id=track_id, order=i)
for i, track_id in track_ids
])
return redirect("playlists:list_playlists")
这样可以将整个过程简化为单个db操作,在此(1 + 2n)
之前您已进行过操作(n
即磁道数)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句