Пользовательская модель пользователя Django: IntegrityError: значение null в столбце is_superuser нарушает ограничение not-null

Я пытаюсь создать пользовательскую модель в Django, а затем создать RESTAPI в соответствии с предоставлением django-rest-auth.

CustomUserModel и CustomUSerManager определены как:

   from django.contrib.auth.models import (
      BaseUserManager, AbstractBaseUser
  )

class UserManager(BaseUserManager):
use_in_migrations = True

def create_user(self, email, name, phone_no, user_android_id, user_fcm_token,
                user_social_flag, user_fb_id, user_android_app_version, password=None):
    user = self.model(
        email = self.normalize_email(email),
        phone_no = phone_no,
        password=password,
        user_android_id = user_android_id,
        user_fcm_token = user_fcm_token,
        user_social_flag = user_social_flag,
        user_fb_id = user_fb_id,
        user_android_app_version = user_android_app_version,
        name = name,
    )
    # user.is_staff = False
    # user.is_superuser = True
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_staffuser(self, email, name, phone_no, user_android_id, user_fcm_token,
                user_social_flag, user_fb_id, user_android_app_version, password):
    user = self.create_user(
        email,
        password=password,
        phone_no=phone_no,
        user_android_id=user_android_id,
        user_fcm_token=user_fcm_token,
        user_social_flag=user_social_flag,
        user_fb_id=user_fb_id,
        user_android_app_version=user_android_app_version,
        name=name,
    )
    user.is_staff = True
    user.is_admin = False
    user.is_superuser = True
    user.save(using=self._db)
    return user

def create_superuser(self, email, name, phone_no, user_android_id, user_fcm_token,
                user_social_flag, user_fb_id, user_android_app_version, password):
    user = self.create_user(
        email,
        password=password,
        phone_no=phone_no,
        user_android_id=user_android_id,
        user_fcm_token=user_fcm_token,
        user_social_flag=user_social_flag,
        user_fb_id=user_fb_id,
        user_android_app_version=user_android_app_version,
        name=name,
    )
    user.is_admin = True
    user.save(using=self._db)
    return user


class User(AbstractBaseUser):
   objects = UserManager()

   name = models.CharField(max_length=100, blank=True, null=True)
   email = models.EmailField(unique=True)
   created_at = models.DateField(blank=True, null=True)
   phone_no = models.BigIntegerField(blank=True, null=True)
   user_android_id = models.CharField(max_length=255, blank=True, null=True)
   user_fcm_token = models.CharField(max_length=255, blank=True, null=True)
   user_social_flag = models.IntegerField(blank=True, null=True)
   user_fb_id = models.CharField(max_length=255, blank=True, null=True)
   user_android_app_version = models.CharField(max_length=25, blank=True, null=True)

   USERNAME_FIELD = 'email'

   def __str__(self):  
      return self.email

Пользовательский файл просмотра:

from rest_auth.registration.views import RegisterView
from app.models import User

class CustomRegisterView(RegisterView):
    queryset = User.objects.all()

В файле settings.py я установил:

AUTH_USER_MODEL = 'app.User'
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_EMAIL_FIELD = 'email'
ACCOUNT_LOGOUT_ON_GET = True


 REST_AUTH_SERIALIZERS = {
   "USER_DETAILS_SERIALIZER": 
  "app.serializers.CustomUserDetailsSerializer",
 }
REST_AUTH_REGISTER_SERIALIZERS = {
    "REGISTER_SERIALIZER": 
  "app.serializers.CustomRegisterSerializer",
 }

Я установил URL-адреса в файле URL.

re_path(r'^registration/$', views.CustomRegisterView.as_view())

Когда я запускаю / registration / url и заполняю все данные, я получаю сообщение об ошибке:

django.db.utils.IntegrityError: значение null в столбце "is_superuser" нарушает ограничение not-null. ДЕТАЛИ: Неудачная строка содержит (8, pbkdf2_sha256 $ 120000 $ VpGItoUPHoJ9 $ yBQB2PqRDiqd4SQ2cDZX / null, null, null, null, [email protected], null, null, null, null, null, null, null).

Что мне здесь не хватает?

ОБНОВЛЕНИЕ 1:

Проверяя записи в базе данных, я обнаружил, что вставляются только поля электронной почты, пароля и last_login, а все остальные равны нулю. В чем может быть причина?

ОБНОВЛЕНИЕ 2:

CustomRegisterSerializer класс: -

   class CustomRegisterSerializer(RegisterSerializer):
    email = serializers.EmailField()
    password1 = serializers.CharField(write_only=True)
    name = serializers.CharField()
    phone_no = serializers.IntegerField()
    user_android_id = serializers.CharField()
    user_fcm_token = serializers.CharField(required=True)
    user_social_flag = serializers.IntegerField()
    user_fb_id = serializers.CharField(required=True)
    user_android_app_version = serializers.CharField()

    class Meta:
        model = User
        fields = ('email', 'name', 'phone_no', 'user_android_id', 'user_fcm_token',
                  'user_social_flag', 'user_fb_id', 'user_android_app_version')

    def get_cleaned_data(self):
        super(CustomRegisterSerializer, self).get_cleaned_data()

        return {
            'password1': self.validated_data.get('password1', ''),
            'email': self.validated_data.get('email', ''),
            'phone_no': self.validated_data.get('phone_no'),
            'name': self.validated_data.get('name'),
            'user_android_id': self.validated_data.get('user_android_id'),
            'user_fcm_token': self.validated_data.get('user_fcm_token'),
            'user_social_flag': self.validated_data.get('user_social_flag'),
            'user_fb_id': self.validated_data.get('user_fb_id'),
            'user_android_app_version': self.validated_data.get('user_android_app_version'),

        }

person Reema Parakh    schedule 14.11.2018    source источник


Ответы (1)


В create_user вы комментировали is_staff и is_superuser. Раскомментируйте и установите для них False.

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

О полях, не попадающих в базу данных - is_staff и is_superuser не определены в вашей пользовательской модели, а также не определены в AbstractBaseUser. Что странно, потому что в этом случае вы вообще не должны были получать это исключение.

Вы только начинаете свой проект или выполняли миграции перед заменой пользовательской модели? Если вы начали с пользовательской модели по умолчанию из Django, вам потребуется еще немного поработать. Надеюсь, у вас еще нет реальных пользователей, и вы сможете сделать это быстро. Внимательно изучите тему в документации Django.

person 4140tm    schedule 14.11.2018
comment
Здорово. +1. Это помогло. Спасибо. - person Reema Parakh; 14.11.2018
comment
Еще одна вещь, могу ли я настроить ответ RegisterAPIView и LoginAPIView, чтобы то же самое использовалось для android и ios. - person Reema Parakh; 15.11.2018
comment
Проверяя записи в базе данных, я обнаружил, что вставляются только поля электронной почты, пароля и last_login, а все остальные равны нулю. В чем может быть причина? - person Reema Parakh; 15.11.2018
comment
Хорошо, я обновил модель, и теперь настраиваемые поля сохранены. Еще один момент: когда мы регистрируемся с использованием API, он возвращает значение ключа. Но я хочу настроить ответ с дополнительными полями, такими как значение первичного ключа и result_flag, который будет либо 0, либо 1. Как мы можем этого добиться? - person Reema Parakh; 15.11.2018
comment
Думаю, это отдельный вопрос. - person 4140tm; 15.11.2018
comment
Как и было предложено, я создал новый вопрос. Проверьте эту ссылку - stackoverflow.com/questions/53319843/ - person Reema Parakh; 15.11.2018