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']
.
中的值
在 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']
.