Как решить TypeError в /api/register/ Прямое назначение на прямую сторону множества "многие ко многим" запрещено. Вместо этого используйте groups.set()
class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
# fields = '__all__'
fields = ('id', 'username', 'email', 'password', 'is_active', 'is_staff', 'is_superuser'
, 'Designation', 'Address', 'groups', 'profile')
def create(self, validated_data, ):
user = Person.objects.create(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password'],
Designation=validated_data['Designation'],
is_active=validated_data['is_active'],
is_staff=validated_data['is_staff'],
is_superuser=validated_data['is_superuser'],
Address=validated_data['Address'],
profile=validated_data['profile'],
groups=validated_data['groups']
)
user.set_password(make_password(validated_data['password']))
user.save()
return user
Как я могу решить следующую ошибку:
TypeError at /api/register/ Direct assignment to the forward side of a many-to-many set is prohibited. Use groups.set() instead
Вы не можете заполнить groups при создании Person, так как в этот момент у Person еще нет первичного ключа, и поэтому этот первичный ключ не может быть использован для таблицы соединения отношения "многие-ко-многим".
def create(self, validated_data):
user = Person.objects.create(
username=validated_data['username'],
email=validated_data['email'],
password=validated_data['password'],
Designation=validated_data['Designation'],
is_active=validated_data['is_active'],
is_staff=validated_data['is_staff'],
is_superuser=validated_data['is_superuser'],
Address=validated_data['Address'],
profile=validated_data['profile'],
# no groups=…
)
# add groups to the user ↓
user.groups.add(*validated_data['groups'])
user.set_password(make_password(validated_data['password']))
user.save()
return user
логика может быть сокращена с помощью:
def create(self, validated_data):
groups = validated_data.pop('groups', ())
user = Person.objects.create(
**validated_data
)
# add groups to the user ↓
user.groups.add(*groups)
user.set_password(make_password(validated_data['password']))
user.save()
return user