Как я могу создать экземпляр модели с CreateAPIView по почте JSON - PullRequest
0 голосов
/ 18 апреля 2019

Я сделал модель StudyGroup с пользователями.Если я хочу создать StudyGroup с CreateAPIView, какие данные я должен опубликовать для создания модели StudyGroup?

from django.db import models
from django.contrib.auth.models import User

class StudyGroup(models.Model):
    class Meta:
        ordering = ('created',)
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=20)
    users = models.ManyToManyField(User, related_name='study_groups')

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'study_groups')

class StudyGroupSerializer(serializers.ModelSerializer):
    users = UserSerializer(many=True)
    class Meta:
        model = StudyGroup
        fields = ('id', 'name', 'users')

from rest_framework import generics, permissions
from django.contrib.auth.models import User

class StudyGroupCreate(generics.CreateAPIView):
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    queryset = StudyGroup.objects.all()
    serializer_class = StudyGroupSerializer


urlpatterns = [
    path('create_study_group/', views.StudyGroupCreate.as_view()),
]

Отправленные данные ("name": "creation_group" было в теле, и auth был в порядке)

"users": [2, 3]     // 2, 3 is userid in DB
"users": 2

"users": ["A", "B"] // A, B is username in DB
"users": "A"

Статус ответа = 400

{
    "users": [
        "This field is required."
    ]
}

1 Ответ

0 голосов
/ 18 апреля 2019

Наличие users = UserSerializer(many=True) в сериализаторе исследовательской комиссии означает, что он ожидает массив пользовательских объектов, как определено в пользовательском сериализаторе.Для публикации пользователей рекомендуется добавить в сериализатор еще одно поле, предназначенное только для записи, в то время как определенное вами поле должно быть доступно только для чтения.Как то так:

class StudyGroupSerializer(serializers.ModelSerializer):
    users = UserSerializer(many=True, read_only=True)
    user_ids = serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all(), required=True, write_only=True)
    # these ids get converted to actual users after validation
    class Meta:
        model = StudyGroup
        fields = ('id', 'name', 'users', 'user_ids')

    def create(self, validated_data):
        user_ids = validated_data.pop('user_ids')
        instance = super().create(validated_data)
        for user in user_ids:
            instance.users.add(user)
        return instance
...