Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Проверка на существование записи в БД [RSS Feed]

#1 Июнь 19, 2013 23:01:05

kvadrat
От:
Зарегистрирован: 2011-07-13
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

Есть модель вот такая:

class Entry1 (models.Model):
user = models.ForeignKey(MyUser)
line = models.CharField(max_length=64)
textblock = models.TextField()
мне нужно что бы при создании записи происходила проверка - создавал ли уже юзер запись с таким line, если, да указать ему на это. я нашел как примерно это на языке mysql делается. как это сделать во вьюхе?



Офлайн

#2 Июнь 19, 2013 23:13:57

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

например Entry1.objects.filter(user=user_we_check, line=line_we_check).exists()
если нужно еще и проверить, сколько таких записей - вместо exists() ставьте count()



Офлайн

#3 Июнь 19, 2013 23:30:10

kvadrat
От:
Зарегистрирован: 2011-07-13
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

if Entry1.objects.filter(user=user_we_check, line=line_we_check).exists() вернет treue/false ?



Офлайн

#4 Июнь 19, 2013 23:52:35

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

ага, exists() вернет булево True, если хоть одна запись есть.
Но с точки зрения задачи - вы подумайте, нужно ли так делать.
Возможно, вам выгоднее просто сделать user и line unique_together,
и при записи сделать try/except.
“Выгоднее” - в смысле на одно обращение к базе меньше. С другой стороны, на один комбинированный индекс больше. В общем, вам виднее, что вам нужнее :)



Офлайн

#5 Июнь 20, 2013 00:05:06

kvadrat
От:
Зарегистрирован: 2011-07-13
Сообщения: 69
Репутация: +  1  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

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



Офлайн

#6 Июнь 20, 2013 14:24:05

crazyman2004
Зарегистрирован: 2013-06-19
Сообщения: 28
Репутация: +  2  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

line = models.CharField(max_length=64)
почему бы не поставить этому полю проверку на уникальность?

Офлайн

#7 Июнь 20, 2013 14:47:59

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

> создавал ли уже юзер запись с таким line
проверка на уникальность только line приведет к тому, что из оригинального требования нужно будет исключить слово “юзер”



Офлайн

#8 Июнь 20, 2013 16:56:00

akava
Зарегистрирован: 2013-04-01
Сообщения: 6
Репутация: +  2  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

Sergei, что мешает повесить констрэйнт на два поля?
https://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

  class Meta:
    unique_together = ('user', 'line',)

Офлайн

#9 Июнь 20, 2013 17:39:24

Sergei
От:
Зарегистрирован: 2011-10-04
Сообщения: 29
Репутация: +  4  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

да ничего не мешает, я это автору вопроса как вариант в 4-м комментарии и написал,
пусть решает, если его дополнительный индекс устраивает, нормальное решение.



Офлайн

#10 Июнь 20, 2013 17:48:12

akava
Зарегистрирован: 2013-04-01
Сообщения: 6
Репутация: +  2  -
Профиль   Отправить e-mail  

Проверка на существование записи в БД

Ну да, теперь понятно что ты имел ввиду под словом индекс
В “моей” терминологии это не индекс, а констрэйнт)))

Офлайн

  • Начало
  • » Django
  • » Проверка на существование записи в БД[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version