Как мне изменить метод сериализатора create(), чтобы сделать связь с вложенным объектом в Django REST Framework?

В моем приложении группы создаются пользователями

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ["user_id", "username"]


class GroupSerializer(serializers.ModelSerializer):
    owner = UserSerializer()

    class Meta:
        model = Group
        fields = ["name", "picture_url", "owner", "members"]

    def create(self, validated_data):
        owner_data = validated_data.pop("owner")
        user = User.objects.filter(user_id=owner_data.get("user_id"))
        instance = Group.objects.create(**validated_data)
        instance.owner = user
        instance.save
        return instance

Я пытаюсь сделать так, чтобы я мог создать объект Group, который может иметь только существующего пользователя в качестве своего владельца, но почему-то когда я пишу следующее:

    "owner": {
        "user_id":6
    },
    "picture_url":"nothing",
    "name":"jazz club"
}

Выдает следующее:

{
    "owner": {
        "user_id": [
            "user with this user id already exists."
        ],
        "username": [
            "This field is required."
        ]
    }
}

Для контекста, мой метод отправки сообщений выглядит следующим образом:

    def post(self, request):
        new_group = request.data
        new_group["members"] = []
        serializer = self.serializer_class(data=new_group)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        return Response(serializer.data, status=status.HTTP_201_CREATED)

А мои модели выглядят следующим образом:

class User(models.Model):
    id = models.BigAutoField(primary_key=True, unique=True)
    user_id = models.BigIntegerField(unique=True)
    username = models.CharField(max_length=100)


class Group(models.Model):
    name = models.CharField(max_length=255, unique=True)
    picture_url = models.CharField(max_length=255)
    owner = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="owned_groups",
        blank=True,
    )
    members = models.ManyToManyField(User, related_name="groups", blank=True)

Что мне нужно изменить, чтобы это работало? Я пробовал много разных вещей.

Я думаю, что вам нужно загрузить owner_id, если у него есть только существующий пользователь в качестве владельца.

class GroupSerializer(serializers.ModelSerializer):
    owner = UserSerializer(read_only = True)
    owner_id = serializers.IntegerField(write_only = True)

    class Meta:
        model = Group
        fields = ["name", "picture_url", "owner", "members", "owner_id"]
    
    # then you don't need to customize create method
    def create(self, validated_data):
        pass

А полезная нагрузка должна быть,

{
    "owner_id": 1,
    "picture_url":"nothing",
    "name":"jazz club"
}
Вернуться на верх