我有一个非托管模型,如下所示:
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所做的只是跳过foo
与parent_id == 0
的情况。如果parent
中没有list_display
,将显示所有对象。
当我运行类似Foo.objects.filter(parent_id=0)
的东西时,它返回0个对象,但是我确定数据库中有很多对象。 Foo.objects.all()
将仅返回父ID不为零的对象。
那么我应该如何处理这种情况(除了进行数据库迁移外,这可能会破坏与django不相关但与现有数据库对话的现有前端)?
或者至少如何使模型管理器返回所有对象,而不仅仅是具有非零Foo
的{{1}}实例?
首先想到的是使用另一个模型字段,并在每次需要时(通过属性或其他方式)手动检索父级:
parent_id
还有其他想法吗?