Как решить 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
Вернуться на верх