проверка наследования нескольких таблиц в django с помощью приложения администратора - PullRequest
0 голосов
/ 17 июня 2019

При работе с моделью Django с многостольным наследованием при настройке, как в документах, приложение администратора не может добавить новую модель "Ресторан", если существует соответствующая запись "Место" - администраторприложение возвращает «Место с таким именем уже существует».

Модель Django предоставляет методы для проверки формы, а Модель обеспечивает проверку уникальности.
лучшее место, чтобы включить превращение существующей записи Места в Ресторан?
Как бы вы это сделали?

Например, существует Место (name = "hotdogshop", address = "bond street"), ипользователь пытается добавить ресторан (serve_hot_dogs = True, serve_pizza = False, name = "hotdogshop", address = "уличная улица").Желаемый конечный результат будет таким же, как если бы мы добавили «hotdogshop» в качестве «Restaraunt» для начала.

1 Ответ

0 голосов
/ 18 июня 2019

Первоначальный хакерский обходной путь - добавить дополнительную проверку уникальности к проверке модели и перейти на использование django-typed-models , чтобы мы могли переделывать модели.

Например, добавьте следующий псевдокод в вашу модель.

def _perform_unique_checks(self, unique_checks):

    print("Performing custom Recast Unique Check")

    try:
        # Search for any existing Model you want to replace.
        exists = MyModel.objects.get(...)
        if exists:
            # django-typed-models can be recast without affecting integrity.
            exist.recast('myApp.mySubclassedModel')
            # Pretend nothing went wrong, so the rest of the save process continues.
            return {}

    except TwitterHarvestedUser.DoesNotExist:
        pass

    return super()._perform_unique_checks(unique_checks)

Будьте осторожны при объединении данных из предыдущей и новой модели. Метод Djangos save () по умолчанию в конечном итоге заменяет все поля старых моделей, даже если они не изменились в новой модели.

Это не работает с MyModel.objects.create ()

...