Ошибка целостности вызвано сигналом: Джанго админ

Обновить

April 2019

Просмотры

69 раз

1

У меня есть стандартная UserProfileмодель , которая имеет OneToOneFieldполе для auth.Userмоделирования.

Каждый Userдолжен иметь один и только один , UserProfileпоэтому мне нужно UserProfileобъект должен быть создан , когда ВСЕГДА Userсоздается.

Очевидное решение состоит в создании post_saveСингаля:

@receiver(post_save,sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.get_or_create(user=instance)

ПРОБЛЕМА:

Этот подход работает , когда userзарегистрировались , или когда userбыл создан программно (например, с помощью оболочки).

Проблема заключается в том, когда userсоздается путем django-admin. Он поднимает:

продублировать значение ключа нарушает ограничение уникальности "main_userprofile_user_id_key" ДЕТАЛЬ: Key (user_id) = (30), уже существует.

Я добавил UserProfileвстроенный в Userстраницу администратора , что означает , что существуют две формы - для Userсоздания и для UserProfileсоздания.

admin.site.unregister(User)


class UserProfileInline(admin.StackedInline):
    model = UserProfile


class UserAdmin(BaseUserAdmin):
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        # (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    #
    ordering = ('username',)
    inlines = [UserProfileInline]
    list_display = ['id', 'username', 'userprofile__display_name','last_login']

Теперь, когда администратор создает новый userчерез django-adminи заполняет , по меньшей мере , одно UserProfileполе формы, Джанго пытается создать UserProfileдля userдвух раз , которое возвращает ошибку. После того, как он будет создан из signalи во второй раз , потому что было по крайней мере , одна форма поля UserProfileформы заполнены.

Вы знаете, как заставить его работать?

РЕДАКТИРОВАТЬ

Я хотел бы добавить условие в signal:

if not getattr(instance,'userprofile'):
    # create userprofile

но сигнал вызывается перед тем UserProfileModelForm от администратора сохраняется , так что не поможет.

0 ответы