我有一个带有 javascript 的 html 表,它允许对通过 POST 表单传递 track_id 列表和行顺序列表的行进行排序。
我刚刚使用 through 为模型添加了 PlaylistTrack 类,以便我可以向 Tracks.m2m 字段添加排序。下面的 View 在添加直通模型之前就可以工作,但现在我不确定应该如何保存带有关联订单号的轨道列表,因为我无法使用 add() 和我必须使用create()。我应该如何在我的 View 中使用 create() 来保存 track_id 列表并将订单号与列表相关联?我可以使用bulk_create吗?
模型.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")
这将整个过程简化为单个数据库操作,您之前进行过 (1 + 2n)
操作(n
是轨道数)。
关于django 通过模型将外键对象列表保存到 m2m 字段并进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106969/