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'].