Я пытаюсь создать профиль в функции создания DRF в сериализаторе, но при сохранении модели пользователя запускается следующее исключение
ValueError: "<Usuario: Some Name>" needs to have a value for field "id" before this many-to-many relationship can be used.
Это мой фон конфигурации поверх python 3 Джанго == 1.11 DRF == Django rest framework
class CustomUserManager(BaseUserManager):
def _create_user(self, firstname, lastname, password, **extra_fields):
now = timezone.now()
if not firstname:
raise ValueError(u'The firstname is required.')
user = self.model(
firstname=firstname,
lastname=lastname,
last_login=now,
**extra_fields
)
user.set_password(password)
user.save()
return user
class Usuario(
AbstractBaseUser, PermissionsMixin,
TimeStampedModel, SoftDeletableModel
):
objects = CustomUserManager()
class Profile(models.Model):
user = models.OneToOneField(Usuario, related_name='profile', on_delete=models.CASCADE)
class UserSerializer(serializers.ModelSerializer):
profile = PerfilSerializer(read_only=True)
def create(self, validate_data):
user_data = validate_data
profile_data = validate_data.pop('profile')
usr = Usuario(**user_data)
usr.save()
profl = Profile(**profile_data)
profl.save()
profl.user.set(usr)
return usr
Я хочу получить модель с экземпляром пользователя и созданным профилем
Проблема в данных запроса, потому что у меня есть другое отношение многие ко многим class Usuario( AbstractBaseUser, PermissionsMixin, TimeStampedModel, SoftDeletableModel ): empresas = models.ManyToManyField(Companies, related_name='societies')
И это блокирует вставку
попробуй это. profl = Profile(**profile_data) profl.user = user profl.save()
Просто используйте сигналы Django при сохранении пользователя.
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
Ознакомьтесь с этим конкретным руководством, так как оно решает вашу проблему.
https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html
Рад помочь вам!
Вы на правильном пути, просто настройте свой create
в сериализаторе профиля. Попробуй это:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = Profile
def create(self, validated_data):
user = User.objects.create(**validated_data)
Profile.objects.create(user=user)
return user
добавить сигнал post_save в модель пользователя.