У меня есть неуправляемая модель, которая выглядит следующим образом:
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
строки / экземпляра, либо 0 (вместо того, чтобы просто сделать поле обнуляемым). Foo
с идентификатором 0 не существует.
Когда я пытаюсь отобразить эту модель в панели администратора, 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()
вернет только объекты с ненулевыми родительскими идентификаторами.
Итак, как мне поступить с такой ситуацией (кроме миграции базы данных, которая может потенциально сломать существующий интерфейс, который не связан с django, но говорит с существующей базой данных)?
Или хотя бы как заставить менеджер моделей возвращать все объекты, а не только Foo
экземпляры с ненулевым parent_id
?
Сначала подумайте, что приходит на ум использовать другое поле модели и вручную извлекать родительский элемент каждый раз, когда мне это нужно (через свойство или что-то еще):
parent_id = models.IntegerField(default=0)
Любые другие идеи?