django管理员:如何处理非托管表中损坏的外键?

时间:2020-02-24 16:42:31

标签: django

我有一个非托管模型,如下所示:

class Foo(models.Model):
    parent = models.ForeignKey('Foo', on_delete=models.SET_DEFAULT, default=0)
    name = models.CharField(max_length=128)

    class Meta:
        managed = False
        db_table = 'foo'

先前的开发人员决定做一个奇怪的事情:添加parent_id字段,该字段可以是现有Foo行/实例的ID或0(而不是仅使字段为空)。编号为0的Foo不存在。

当我尝试在管理面板中显示此模型时,django不会抱怨:

@admin.register(Foo)
class FooAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'parent')

django所做的只是跳过fooparent_id == 0的情况。如果parent中没有list_display,将显示所有对象。 当我运行类似Foo.objects.filter(parent_id=0)的东西时,它返回0个对象,但是我确定数据库中有很多对象。 Foo.objects.all()将仅返回父ID不为零的对象。

那么我应该如何处理这种情况(除了进行数据库迁移外,这可能会破坏与django不相关但与现有数据库对话的现有前端)?

或者至少如何使模型管理器返回所有对象,而不仅仅是具有非零Foo的{​​{1}}实例?

首先想到的是使用另一个模型字段,并在每次需要时(通过属性或其他方式)手动检索父级:

parent_id

还有其他想法吗?

0 个答案:

没有答案
相关问题