Django: проверьте, существует ли объект уже перед добавлением

Если интерфейс будет внутренним, все его участники будут внутренними к блоку. Если вложенный интерфейс защищен, только подклассы внешнего класса могли бы получить доступ к тому интерфейсу.

Внутренние участники для интерфейса за пределами его объявления блока были бы бессмысленны, как будет защищенные участники для интерфейса за пределами его объявления внешнего класса.

точка интерфейса должна описать контракт между типом реализации и пользователями интерфейса. Внешние вызывающие стороны не собираются заботиться, и не был должен иметь для заботы о реализации, которая является тем, для чего внутренние и защищенные участники.

Для защищенных участников, которых звонит базовый класс, абстрактные классы являются способом пойти для определения контракта между базовыми классами и классами, которые наследовались от них. Но в этом случае, детали реализации обычно очень релевантны, если это не вырожденный чистый абстрактный класс (где весь участники абстрактны), в этом случае, защищенные участники бесполезны. В этом случае пойдите с интерфейсом и сохраните единственный базовый класс для реализации типов для выбора.

27
задан Roch 30 November 2009 в 17:29
поделиться

3 ответа

В вашем менеджере моделей есть вспомогательная функция для этой идиомы, называемая get_or_create:

role, created = UserToUserRole.objects.get_or_create(
    from_user=current_user, to_user=user, role='follow')

It возвращает кортеж из (model, bool), где 'model' - это интересующий вас объект, а 'bool' сообщает вам, нужно ли его создавать или нет.

40
ответ дан 28 November 2019 в 05:17
поделиться

Если вы используете последнюю версию Django, вы можете использовать параметр unique_topting в модели UserToUserRole, а затем использовать метод get_or_create (), который показал Джо Холлоуэй. Это гарантирует, что вы не сможете получить дубликат.

4
ответ дан 28 November 2019 в 05:17
поделиться

Если вы хотите, чтобы проверка выполнялась каждый раз перед сохранением, вы можете использовать для проверки сигнал предварительного сохранения, http://docs.djangoproject.com/en/dev/ref/signals /#django.db.models.signals.pre_save

В качестве альтернативы в модели вы можете указать unique = True для свойства, определяющего, является ли элемент тем же элементом, это вызовет исключение (django.db.IntegrityError) для будет выброшено, если вы попытаетесь сохранить то же самое снова.

Если у вас есть несколько полей вместе, которые делают что-то уникальное, вам нужно использовать unique_toght во внутреннем классе Meta http: //docs.djangoproject. com / en / dev / ref / models / options / # unique-together

0
ответ дан 28 November 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: