Django: как обновить поле ManyToManyField в пользовательской задаче управления Django?

В 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 на сервере и использую их для замены экземпляров таблицы MyModel на моем локальном сервере. (Я запускаю эту пользовательскую задачу управления с моего локального сервера)

Вот что я пробую на данный момент.

Однако я получаю эту ошибку: CommandError: Прямое присвоение прямой стороне множества "многие-ко-многим" запрещено. Вместо этого используйте tags.set().

Как обновить поле tags, которое является полем ManyToMany?

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)

Возможно, вам придется сначала найти объект Tag перед методом .add(). Это зависит от значений в mymodel['tags'].

Вернуться на верх