django 通过模型将外键对象列表保存到 m2m 字段并进行排序

标签 django model manytomanyfield

我有一个带有 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 的回答已经基本涵盖了您的情况。但是,您不需要从数据库中获取 PlaylistTrack 实例,您可以使用 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/

相关文章:

django - 如何在 Jupyter Notebook 中使用 django 3.0 ORM 而不触发异步上下文检查?

java - 如何在javax.print中获取打印机的型号?

MySQL - 选择数据并创建一个 "virtual"表

django - 我的 Django 许多字段都标记为唯一,是否有选项可以删除它?

python - Django Admin - 通过模型过滤 ManyToManyField

django - HTMX 传递所选列表中的按钮值

python - 使用docker在heroku中部署Django api rest

ruby-on-rails - 当没有 ActiveRecord 模型时,Rails Controller ?

python - 带参数的 Django ManyToManyField 过滤器?

python - 如何使用 python-docx 从模板流式传输文件