Django管理员,多对多,保存到数据库并从数据库中检索

时间:2019-07-09 15:12:29

标签: django django-models django-admin

我在两个模型之间建立了一种非常简单的关系:Person和该人访问过的城市(City)。

class Person(models.Model):
    ...
    cities = models.ManyToManyField(City)

我正在为此编写一个管理页面,并且为Person有一个单独的表单类,它根本没有提到城市,并且有一个继承自admin.ModelAdmin的类。

我需要调用一个函数,传递完全保存的Person实例,并将所有字段正确更新并保存到db,包括城市。但是,无论我重写哪种save...方法,我都可以获取Person实例进行保存,并且可以从数据库中读取新值,但是,我无法从数据库中获取更新的城市。我尝试过的是ModelAdmin中save_m2m_save_m2m形式的save_formsave_related。在这些位置中的每个位置,我都叫super().<the method>,然后选中person.cities.all()。每次我得到旧值(更新之前在数据库中的值,而不是表单中的新值)。

是否可以找到一个位置以获取多对多字段的实际保存和提交的值?有没有办法将任何东西包装在transaction.atomic中或类似的东西?还是我做错了?

1 个答案:

答案 0 :(得分:0)

到目前为止,我最终要做的是重写changeform_view方法:

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
    result = super().changeform_view(request, object_id, form_url, extra_context)
    if request.method == 'POST':
        bundle = Person.objects.prefetch_related('cities').get(pk=object_id)
        notify_search(bundle)

    return result

不确定这是否是最佳解决方案。如果更好,我很乐意接受其他人的解决方案。