﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33335	Detecting uniqueness doesn't work for models with functional unique constraints.	Hervé Le Roy	Hannes Ljungberg	"When creating a new object from Django Administration site, I'm getting an error ""Tag with this already exists."". (Tag is my model name)

I'm using on this model the new functional unique constraints introducted in Django 4.0 (https://docs.djangoproject.com/en/dev/ref/models/constraints/#django.db.models.UniqueConstraint).

I suppose this is related to the contraints put on the model. However, creating a Tag object with code - e.g. `Tag.objects.create(...)` - works fine. It only fails in Django admin. I'm not sure if it's a bug or misunderstanding/misconfiguration on my side?


This is my model:
{{{
class Tag(models.Model):
    """"""Basic tag model.""""""
    # When using get_or_create, we need to pass tag name as a default value, like this:
    # Tag.objects.get_or_create(defaults={'name': tag}, name__iexact=tag, user=request.user)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name=_('user'))
    name = models.CharField(max_length=50, db_index=False, verbose_name=_('name'),
                            blank=False,  # It's the default behavior, but let's be explicit
                            validators=[RegexValidator(regex=r'[A-z0-9À-ž\s]+',
                                                       message='This field accepts only letters, digits and space.')])
    slug = models.SlugField(max_length=50, verbose_name=_('slug'))

    class Meta:
        ordering = ['name']
        # Make sure tag name:
        # - are unique per user
        # - are case insensitive (prevent adding ""test"" if ""Test"" already exists)
        # - aren't empty
        constraints = [models.UniqueConstraint(fields=['user', 'name'],
                                               name='%(app_label)s_%(class)s_name_unique_per_user'),
                       models.UniqueConstraint(Lower('name'),
                                               name='%(app_label)s_%(class)s_name_case_insensitive'),
                       models.CheckConstraint(check=models.Q(name__length__gt=0),
                                              name='%(app_label)s_%(class)s_name_not_empty')]
(snip)
}}}

This is the admin configuration:
{{{
@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    list_display = ('pk', 'user', 'name', 'slug')
    list_display_links = ['pk']
    fields = ('user', 'name',)
    list_filter = ('user__email',)
    search_fields = ('name',)
}}}"	Bug	closed	Database layer (models, ORM)	4.0	Release blocker	fixed		Hannes Ljungberg	Ready for checkin	1	0	0	0	0	0
