Django: how to update a ManyToManyField in a custom Django management task?(Django:如何在定制的Django管理任务中更新ManyToManyfield?)
本文介绍了Django:如何在定制的Django管理任务中更新ManyToManyfield?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在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:禁止直接赋值到多对多集合的前端。请改用tag s.set()。
如何更新作为ManyToMany字段的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:如何在定制的Django管理任务中更新ManyToManyfield?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Django:如何在定制的Django管理任务中更新ManyToManyfield?


基础教程推荐
猜你喜欢
- 使用大型矩阵时禁止 Pycharm 输出中的自动换行符 2022-01-01
- Plotly:如何设置绘图图形的样式,使其不显示缺失日期的间隙? 2022-01-01
- 在同一图形上绘制Bokeh的烛台和音量条 2022-01-01
- 在Python中从Azure BLOB存储中读取文件 2022-01-01
- 无法导入 Pytorch [WinError 126] 找不到指定的模块 2022-01-01
- 求两个直方图的卷积 2022-01-01
- 修改列表中的数据帧不起作用 2022-01-01
- 包装空间模型 2022-01-01
- PANDA VALUE_COUNTS包含GROUP BY之前的所有值 2022-01-01
- PermissionError: pip 从 8.1.1 升级到 8.1.2 2022-01-01