我想在模型的ManyToMany字段中自动添加一些项目,当它保存在Django管理界面中时。但是,调用model.many2manyfield.add()会无声地失败
我的django应用程序的models.py
...
class Dashboard(models.Model):
name = models.TextField()
url = models.TextField()
graphs = models.ManyToManyField(Graph, null=True, blank=True)
我的django应用程序的admin.py
from models import Dashboard
...
class DashboardAdmin(GraphAdmin):
def save_model(self, request, dashboard, form, change):
dashboard.save()
graphite_util.sync_dashboard_graphs(dashboard)
...
admin.site.register(Dashboard, DashboardAdmin)
来自graphite_util.py的:
def sync_dashboard_graphs(dashboard):
print "Syncing %s " % dashboard
...
graph = None
try:
graph = Graph.objects.get(url=url)
except Graph.DoesNotExist:
graph = Graph()
graph.url = url
graph.save()
print "adding graph %s to dashboard %s" %(graph, dashboard)
dashboard.graphs.add(graph) #TODO: why does this fail silently?
我想做的事情是不合法的?如果是这样,还有其他选择吗?
谢谢!
答案 0 :(得分:1)
原则上应该有效;但是,您的代码中存在一些不一致之处。例如,您正在查看基于url
的图表。你已经编辑了部分代码,所以你可能在缺失的部分创建了变量,但我不确定你从哪里得到这些信息;您无权使用此方法访问request
。
但是,您可以将请求传递到save_model
中调用它的方法,因为请求在那里可用。
此外,如果您只想在except块中创建图表,最好使用get_or_create
。
graph = Graph.objects.get_or_create(url=url)
它基本上做同样的事情,但更简洁。