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?
基础教程推荐
猜你喜欢
- 合并具有多索引的两个数据帧 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01