django admin: как бороться со сломанными внешними ключами в неуправляемой таблице? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть неуправляемая модель, которая выглядит следующим образом:

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)

Любые другие идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...