Django: проверьте, существует ли объект перед добавлением - PullRequest
26 голосов
/ 30 ноября 2009

Это довольно простой вопрос по Django, но я не могу найти ответ в документации по Django, несмотря на большую охоту!

Как проверить, существует ли объект, и добавить его, только если он не уже существует?

Вот код - я не хочу дважды добавлять follow_role в базу данных, если она уже существует. Как мне проверить в первую очередь? Возможно, используйте get () - но будет ли Джанго жаловаться, если get () ничего не вернет?

current_user = request.user
follow_role = UserToUserRole(from_user=current_user, to_user=user, role='follow')
follow_role.save()

Спасибо!

Ответы [ 5 ]

38 голосов
/ 30 ноября 2009

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

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

Возвращает кортеж (модель, bool), где «модель» - это объект, который вас интересует, а «bool» говорит вам, нужно ли его создавать или нет.

4 голосов
/ 30 ноября 2009

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

1 голос
/ 14 мая 2018

Если вы ищете значение bool

UserToUserRole.objects.filter(
    from_user=current_user, to_user=user, role='follow'
).exists()
0 голосов
/ 28 апреля 2017

Вы можете использовать get (), но вам придется обернуть его с помощью try-исключением, например:

try:
    obj = UserToUserRole.objects.get(from_user=current_user, to_user=user, role='follow')
except UserToUserRole.DoesNotExist:
    # here write a code to create a new object
0 голосов
/ 30 ноября 2009

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

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

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

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