自定义django管理类可以将项添加到模型的ManyToMany字段吗?

时间:2012-01-19 22:26:57

标签: django django-admin

我想在模型的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?

我想做的事情是不合法的?如果是这样,还有其他选择吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

原则上应该有效;但是,您的代码中存在一些不一致之处。例如,您正在查看基于url的图表。你已经编辑了部分代码,所以你可能在缺失的部分创建了变量,但我不确定你从哪里得到这些信息;您无权使用此方法访问request

但是,您可以将请求传递到save_model中调用它的方法,因为请求在那里可用。

此外,如果您只想在except块中创建图表,最好使用get_or_create

graph = Graph.objects.get_or_create(url=url)

它基本上做同样的事情,但更简洁。