Ошибочное пользовательское поле модели пользователя "один к одному" в панели администратора

Я создал пользовательскую модель Subscriber один-к-одному для расширения существующей модели Django's User. (я знаю, что лучше использовать AbstractUser, но я просто хотел попробовать это ради обучения)

Я могу успешно создать нового пользователя через shell, и я могу редактировать (в панели администратора) пользовательские поля, которые пользователь имеет после создания. Однако, я не могу создавать новых пользователей в панели администратора без использования shell, из-за ошибки.

Полагаю, что что-то не так с файлом admin.py?


Ошибка:

IntegrityError at /admin/auth/user/add/

UNIQUE constraint failed: app_subscriber.user_id

models.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver


class Subscriber(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    location = models.CharField(max_length=30, blank=True)


@receiver(post_save, sender=User)
def create_user_subscriber(sender, instance, created, **kwargs):
    if created:
        Subscriber.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_subscriber(sender, instance, **kwargs):
    instance.subscriber.save()

admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User

from . import models


# Define an inline admin descriptor for Subscriber model
# which acts a bit like a singleton
class SubscriberInline(admin.StackedInline):
    model = models.Subscriber
    can_delete = False
    verbose_name_plural = 'subscribers'

# Define a new User admin
class UserAdmin(BaseUserAdmin):
    inlines = (SubscriberInline,)

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

не хорошо создавать буксировку одного и того же сигнала (post_save для User), создайте только один и делайте все на нем

@receiver(post_save, sender=User)
def create_user_subscriber(sender, instance, created, **kwargs):
    if created:
        Subscriber.objects.create(user=instance)


@receiver(post_save, sender=User)
def save_user_subscriber(sender, instance, **kwargs):
    instance.subscriber.save()

Ваша ошибка говорит о том, что вы не можете создать 2 подписчика с одним и тем же пользователем (ограничение UNIQUE)

это любит вашу проблему

@receiver(post_save, sender=User)
def create_user_subscriber(sender, instance, created, **kwargs):
    # you check if instance are 'subscriber' related name create by OneToOneField , if not create Subcriber model
    if created and not hasattr(instance, 'subscriber'):
        Subscriber.objects.create(user=instance)
Вернуться на верх