Django (dj-rest-auth) Пользовательская регистрация пользователей с помощью ForeignKey
Я создал пользователя custome в моем приложении, и указывает на запись часового пояса, в модели TimeRegion Model.
model.py
class TimeRegion(models.Model):
id=models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False,)
tz_key=models.CharField(max_length=200,)
class CustomUser(AbstractUser):
id=models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False,)
user_timezone=models.ForeignKey(TimeRegion,verbose_name="Time Zone",on_delete=models.DO_NOTHING, blank=True, null=True)
Расширение вызова API для включения пользовательского поля. serializers.py
class CustomRegisterSerializer(RegisterSerializer):
first_name = serializers.CharField()
last_name = serializers.CharField()
statement_agreement = serializers.BooleanField()
user_timezone = serializers.UUIDField() #Tried CharField() and PrimaryKeyField()
def get_cleaned_data(self):
super(CustomRegisterSerializer, self).get_cleaned_data()
return {
'username': self.validated_data.get('username', ''),
'password1': self.validated_data.get('password1', ''),
'password2': self.validated_data.get('password2', ''),
'email': self.validated_data.get('email', ''),
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'user_timezone': self.validated_data.get('user_timezone', ''),
}
def save(self, request):
adapter = get_adapter()
user = adapter.new_user(request)
self.cleaned_data = self.get_cleaned_data()
adapter.save_user(request, user, self)
setup_user_email(request, user, [])
user.user_timezone = self.cleaned_data.get('user_timezone')
user.save()
return user
setting.py
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'api.serializers.CustomRegisterSerializer'
}
Каждый раз, когда я запускаю тест API, чтобы проверить, что я могу зарегистрировать нового пользователя, я получаю следующее сообщение об ошибке: код теста
# Get the timezone record
url_timezone = 'http://127.0.0.1:8000/api/v1/timezonelist/'
response_timezone = self.client.get(url_timezone, content_type='application/json')
#Register the user to the first timezone:
url_signup = 'http://127.0.0.1:8000/api/v1/dj-rest-auth/registration/'
params_signup={
'first_name': 'John',
'last_name': 'Tester',
'email':'testuser@email.com',
'password1':'pwdktudchJsuec123',
'password2':'pwdktudchJsuec123',
'user_timezone': response_timezone.data[0]['id'],
}
response_signup = self.client.post(url_signup, data=json.dumps(params_signup), content_type='application/json')
ответ:
Когда я использую этот подход в других вызовах API (не связанных с пользователем), он работает просто отлично. Я пробовал жестко кодировать, создавая часовой пояс и используя его, но результат тот же.
tz_obj =TimeRegion.objects.create(
region='Europe',
tz_name='Paris',
tz_key='Europe/Paris'
)
...
'user_timezone': tz_obj.pk.hex
Мне интересно, является ли это ограничением dj-rest-auth?