Как мне изменить метод сериализатора 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"
}