如何防止内联中的字段引用Django Admin中最新创建的对象

时间:2019-04-04 05:03:53

标签: django django-admin

我有一个模型PlacedOrder,其他模型使用OneToOneFieldForeignKey引用了该模型。因此,我正在使用StackedTabularInline在我的PlacedOrderAdmin模型上进行渲染。

奇怪的行为是,当我启动django应用程序时,我可以毫无问题地创建一个新的PlacedOrder对象,但是在此之后,当我尝试创建另一个对象时,内联字段上的内容已经被来自我刚刚创建的对象,无论尝试如何都无法创建新对象,它不断向我显示错误“请更正以下错误。”

只有属于内联的字段会这样做,来自模型PlacedOrder的字段是“干净的”。如果我重新启动django,我可以看到所有创建的对象,并且它们的数据似乎正确。

部分模型:

class PlacedOrder(models.Model):
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4(),
        editable=False
    )
    ...
    total = models.DecimalField(
        _('total'),
        max_digits=8,
        decimal_places=2
    )


class OrderStatus(models.Model):
    placed_order = models.OneToOneField(
        PlacedOrder,
        on_delete=models.CASCADE
    )
    status = models.CharField(
        _('status'),
        choices=STATUS_CHOICES,
        max_length=30,
    )

这里是内联之一:

class OrderStatusInline(nested_admin.NestedTabularInline):
    model = app_models.OrderStatus

和订单

@admin.register(app_models.PlacedOrder)
class OrderAdmin(nested_admin.NestedModelAdmin):
    inlines = (OrderStatusInline, OrderPaymentInline, OrderDeliveryInline, SelectedProductInline, )

已修复

因此我发现问题与我在此处发布的内容无关,实际上是我在id内声明PlacedOrder的方式。

在我的原始模型上,我将默认设置设置为uuid.uuid4(),但这会造成所有问题,一旦将其更改为uuid.uuid4,一切都会好起来的。

1 个答案:

答案 0 :(得分:0)

我认为问题在于,对于OneToOne关系,定义关系的实际字段必须位于内联模型上,而不是父模型上-与外键完全相同

有关更多信息,请查看此帖子:Django Admin: OneToOne Relation as an Inline?