Найти - Пользователи
Полная версия: Как сделать уникальные записи в БД в пределах пользователя?
Начало » Django » Как сделать уникальные записи в БД в пределах пользователя?
1 2
buddha
Здравствуйте. Аргумент unique поля модели делает проверку на уникальность по всей таблице БД.
Как сделать, чтобы уникальность проверялась в этой же таблице БД в пределах одного пользователя?
Lexander
Добавить приблизительно такой класс внутрь модели:
class MyModel(models.Model):
    class Meta:
        unique_together = [('my_field', 'user_id'), ]

Учтите только, что сделать составной первичный ключ Джанго вам не даст - не умеет.
buddha
Т.е. в этот кортеж нельзя вставлять поле с типом связи, например ForeignKey?
Lexander
Можно, конечно.
class MyModel(models.Model):
    user_id = models.ForeignKey(User)
    my_field = models.SomeStandartField()
    class Meta:
        unique_together = [('my_field', 'user_id'), ]
buddha
Тогда я не понял, что значит “составной первичный ключ”?
Lexander
Это даже в википедии есть.
А вы, простите, программист по специальности, учитесь/учились где?
inoks
Lexander
unique_together
так нельзя, на основе unique_together создаются правила уникальности для SQL таблиц.

можно написать свой валидатор для таблицы, который будет реализововать это правило программно, не на уровне БД.
Lexander
inoks
Конечно, можно переопределить validate_unique, но это сложнее и не так эффективно.
В чем, по вашему, проблема у уникального индекса в таблице?
buddha
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
Можно ссылку на документацию, где про это написано(про свою валидацию)? Мне проще будет сориентироваться.
Lexander
buddha
О чем говорит ошибка?
У вас уже есть записи, нарушающие правило уникальности.
Как раз, что вы хотели получить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB