Форум сайта python.su
Здравствуйте. Аргумент unique поля модели делает проверку на уникальность по всей таблице БД.
Как сделать, чтобы уникальность проверялась в этой же таблице БД в пределах одного пользователя?
Офлайн
Добавить приблизительно такой класс внутрь модели:
class MyModel(models.Model): class Meta: unique_together = [('my_field', 'user_id'), ]
Офлайн
Т.е. в этот кортеж нельзя вставлять поле с типом связи, например ForeignKey?
Офлайн
Можно, конечно.
class MyModel(models.Model): user_id = models.ForeignKey(User) my_field = models.SomeStandartField() class Meta: unique_together = [('my_field', 'user_id'), ]
Офлайн
Тогда я не понял, что значит “составной первичный ключ”?
Офлайн
Это даже в википедии есть.
А вы, простите, программист по специальности, учитесь/учились где?
Офлайн
Lexanderтак нельзя, на основе unique_together создаются правила уникальности для SQL таблиц.
unique_together
Офлайн
inoks
Конечно, можно переопределить validate_unique, но это сложнее и не так эффективно.
В чем, по вашему, проблема у уникального индекса в таблице?
Офлайн
Lexander
попробовал поставить значение в атрибут unique_together = ('owner', ‘link’). Сразу нарвался на ошибку.
Exception Type: IntegrityError Exception Value: columns owner_id, link are not unique
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')
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))
Офлайн
buddha
О чем говорит ошибка?
У вас уже есть записи, нарушающие правило уникальности.
Как раз, что вы хотели получить.
Офлайн