Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Как сделать уникальные записи в БД в пределах пользователя? [RSS Feed]

#1 Дек. 16, 2012 16:28:04

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Здравствуйте. Аргумент unique поля модели делает проверку на уникальность по всей таблице БД.
Как сделать, чтобы уникальность проверялась в этой же таблице БД в пределах одного пользователя?

Офлайн

#2 Дек. 16, 2012 22:47:07

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Добавить приблизительно такой класс внутрь модели:

class MyModel(models.Model):
    class Meta:
        unique_together = [('my_field', 'user_id'), ]

Учтите только, что сделать составной первичный ключ Джанго вам не даст - не умеет.



Офлайн

#3 Дек. 17, 2012 10:12:17

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Т.е. в этот кортеж нельзя вставлять поле с типом связи, например ForeignKey?

Офлайн

#4 Дек. 17, 2012 13:07:17

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Можно, конечно.

class MyModel(models.Model):
    user_id = models.ForeignKey(User)
    my_field = models.SomeStandartField()
    class Meta:
        unique_together = [('my_field', 'user_id'), ]



Офлайн

#5 Дек. 17, 2012 14:40:43

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Тогда я не понял, что значит “составной первичный ключ”?

Офлайн

#6 Дек. 17, 2012 16:17:53

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Это даже в википедии есть.
А вы, простите, программист по специальности, учитесь/учились где?



Офлайн

#7 Дек. 17, 2012 16:21:00

inoks
От: Russia
Зарегистрирован: 2012-12-11
Сообщения: 343
Репутация: +  35  -
Профиль   Адрес электронной почты  

Как сделать уникальные записи в БД в пределах пользователя?

Lexander
unique_together
так нельзя, на основе unique_together создаются правила уникальности для SQL таблиц.

можно написать свой валидатор для таблицы, который будет реализововать это правило программно, не на уровне БД.

Офлайн

#8 Дек. 18, 2012 01:05:04

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

inoks
Конечно, можно переопределить validate_unique, но это сложнее и не так эффективно.
В чем, по вашему, проблема у уникального индекса в таблице?



Офлайн

#9 Дек. 19, 2012 20:54:06

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

Lexander
попробовал поставить значение в атрибут unique_together = ('owner', ‘link’). Сразу нарвался на ошибку.

Exception Type: 	IntegrityError
Exception Value: 	columns owner_id, link are not unique
Я так понял, что валидацию форма проходит, но вот при сохранении модели происходит конфликт…
models.py:
class BookMark(models.Model):
    category = models.ForeignKey(BookMarkCategory, verbose_name=_('Category'))
    owner = models.ForeignKey(User, verbose_name=_('Owner'))
    description = models.TextField(_('Description'), blank=True)
    link = models.CharField(_('Link'), max_length=150)
    priority = models.IntegerField(_('Priority'))
    looked_through = models.BooleanField(_('Looked trough'))
    publick = models.BooleanField(_('Public'))
    class Meta:
        unique_together = ('owner', 'link')

views.py:
def create_bookmark(request):
    if request.POST:
        form = BookMarkForm(request.POST)
        if form.is_valid():
            bookmark = form.save(commit=False)
            bookmark.owner = request.user
            bookmark.save()
            return redirect('show_bookmarks_list')
    else:
        form = BookMarkForm()
    return render(request, 'mybookmark/create_bookmark.html', dict(form=form))

inoks
Можно ссылку на документацию, где про это написано(про свою валидацию)? Мне проще будет сориентироваться.

Офлайн

#10 Дек. 19, 2012 23:45:46

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Как сделать уникальные записи в БД в пределах пользователя?

buddha
О чем говорит ошибка?
У вас уже есть записи, нарушающие правило уникальности.
Как раз, что вы хотели получить.



Офлайн

  • Начало
  • » Django
  • » Как сделать уникальные записи в БД в пределах пользователя?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version