Django:如何在自定义 Django 管理任务中更新 ManyToManyField?

Django: how to update a ManyToManyField in a custom Django management task?

在 Django 中,我有一个模型,其中一个字段 (tags) 是 ManyToManyField:

class MyModel(models.Model):

   id = models.CharField(max_length=30, primary_key=True)
   title = models.CharField(max_length=300, default='')
   author = models.CharField(max_length=300)
   copy = models.TextField(blank=True, default='')
   tags = models.ManyToManyField(Tag)

我在下面有一个自定义管理任务,我在服务器上获取 MyModel table 的所有实例,并使用它来替换 MyModel 的实例table 在我的本地服务器上。 (我是 运行 来自本地的自定义管理任务)

这是我目前正在尝试的。

但是我收到了这个错误:CommandError:禁止直接分配给多对多集合的前向端。请改用 tags.set()。

如何更新属于多对多字段的 tags 字段?

from bytes.models import MyModel

class Command(BaseCommand):

    def handle(self, *args, **options):

        try:
            // get queryset of MyModel instances from server
            queryset = MyModel.objects.using('theserver').all()

            // loop through that queryset and create a list of dictionaries
            mymodel_list = [
                {
                    'id': mymodel['id'],
                    'title': mymodel['title'],
                    'author': mymodel['author'],
                    'copy': mymodel['copy'],
                    'tags': mymodel['tags']
                } 
                for mymodel in queryset
            ]

            //delete all objects in the local MyModel table
            MyModel.objects.all().delete() 

            //replace with MyModel instances from server
            new_mymodel = [
                MyModel(
                    id=mymodel['id'],
                    title=mymodel['title'],
                    author=mymodel['author'],
                    copy=mymodel['copy'],
                    tags=mymodel['tags'] <--- causing error
                )
                for mymodel in mymodel_list
            ]

            MyModel.objects.bulk_create(new_mymodel)

ManyToMany 字段的工作方式不同于任何其他字段。您不能简单地复制它的值,尤其是从字符串中。您可以在创建 MyModel:

之后尝试在循环中添加对象
    //replace with MyModel instances from server
    new_mymodels = []
    for mymodel in mymodel_list:
        new_mymodel = MyModel(
                id=mymodel['id'],
                title=mymodel['title'],
                author=mymodel['author'],
                copy=mymodel['copy']
            )

        for tag in mymodel['tags']:
            new_mymodel.tags.add(tag)

        new_mymodels.append(new_mymodel)

    MyModel.objects.bulk_create(new_mymodel)

您可能必须在 .add() 方法之前首先找到 Tag 对象。这取决于 mymodel['tags'].

中的值