首页 > 解决方案 > Django ModelForms - 如何为连接表设置默认值

问题描述

我正在使用 ModelForms 填充两个具有多对多关系的表。为了简化问题描述,我将使用典型示例,其中有一个 Pizza 表和一个 Toppings 表,一个 Pizza 可以有多个 Topping,一个 Topping 可以放在多个 Pizza 上。真正的应用程序有更复杂的表,但我认为它归结为这里定义的关系: https ://docs.djangoproject.com/en/3.0/topics/db/models/#many-to-many-relationships

一个联结表,其中每条记录由 Pizza_id 和一个 topping_id 和一个 create_time 组成,将两个表联系在一起。该应用程序有一个用于比萨饼和配料表的 Modelform,但只有一个用于连接表的模型(没有 ModelForm)。由于表之间的多对多关系,联结表记录由 django 自动创建。Pizza 模型有这个“领域”:

toppings=models.ManyToManyField (Topping, through=PizzaToppingJunction)

定义多对多关系。

在此示例中,“create_time”字段必须不为空。(注意:还有其他字段,即用户 id 字段,以及我需要设置的“已删除”布尔值。我以 create_time 为例) .

保存 Pizza 记录后,django 尝试创建联结表但失败,因为它没有所需字段的值。我猜我应该使用“through_defaults”,但我没有成功。

我尝试捕捉 m2m_changed 信号并将关系添加到 pk_set:

(pizza.toppings.add ( topping, through_defaults = {"create_time": instance_time})

这(可以理解)导致递归错误。

我尝试手动创建它们:

PizzaToppingsJunction.objects.create (create_time = instance_tine, pizza_id = pizza_id, topping_id = topping_id).

这似乎对下游处理没有任何影响,因为 django 尝试创建缺少必填字段的联结表记录。我认为代码在 m2m_changed 信号之后清除了该表,所以这是有道理的。

任何指导表示赞赏。

谢谢。

标签: pythondjangopostgresql

解决方案


PizzaToppingJunction.create_time可以让它auto_now_add=True自动将值设置为创建记录的时间

create_time = models.DateTimeField(auto_now_add=True)

那么您不需要在表单中设置任何默认值


推荐阅读