Django Rest Framework недействительные данные сериализатора, не могу понять почему
Я создаю простую модель с полем "многие-ко-многим". Модель работает нормально, и я могу создать модель через админ панель, и я могу сделать get запрос, чтобы увидеть эту модель (за исключением того, что он возвращает только идентификаторы пользователей вместо моделей/объектов пользователей). Моя проблема заключается в том, что при создании post запроса для создания указанной модели.
Я получаю одну из двух ошибок в зависимости от вносимых изменений, The serializer field might be named incorrectly and not match any attribute or key on the 'str' instance.
или AssertionError: You cannot call '.save()' on a serializer with invalid data.
, в любом случае это как-то связано с моим сериализатором. Ниже приведена моя модель,
class Schema(models.Model):
week = models.PositiveIntegerField(primary_key=True,
unique=True,
validators=[MinValueValidator(1), MaxValueValidator(53)],
)
users = models.ManyToManyField(MyUser, related_name="users")
class Meta:
ordering = ('week',)
Мое мнение,
class SchemaView(APIView):
permission_classes = (SchemaPermissions,)
def get(self, request):
schemas = Schema.objects.all()
serializer = SchemaSerializer(schemas, many=True)
return Response(serializer.data)
def post(self, request):
data = request.data
serializer = SchemaSerializer(data=data)
serializer.is_valid()
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
И мой сериализатор,
class SchemaSerializer(serializers.ModelSerializer):
class Meta:
model = Schema
fields = ('week', 'users')
def create(self, validated_data):
users_data = validated_data.pop('users')
users = MyUser.objects.filter(id__in=users_data)
schema = Schema.objects.create(week=validated_data.week, users=users)
return schema
def update(self, instance, validated_data):
users_data = validated_data.pop('users')
users = MyUser.objects.filter(id__in=users_data)
instance.users.clear()
instance.users.add(*users)
instance.saver()
return instance
Идея заключается в том, что если номер недели уже существует, то он должен вызвать функцию update() и затем просто перезаписать пользователей, связанных с этим номером недели, в противном случае он должен вызвать create() и создать новый номер недели с отношениями к заданным пользователям. Ниже приведен результат печати сериализатора после его инициализации в представлении.
SchemaSerializer(data={'week': 32, 'users': [1, 2, 3]}):
week = IntegerField(max_value=53, min_value=1, validators=[<UniqueValidator(queryset=Schema.objects.all())>])
users = PrimaryKeyRelatedField(allow_empty=False, many=True, queryset=MyUser.objects.all())
Мне кажется, что сериализатор должен быть валидным для данной модели? Возможно, мне не хватает некоторых концепций и знаний о Django и DRF, так что любая помощь будет очень признательна!
Сначала вам нужно установить поле для сохранения users
в SchemaSerializer
. И вам не нужно настраивать метод create
и update
, потому что логика может быть закодирована в views
.
class SchemaSerializer(serializers.ModelSerializer):
users = UserSerializer(read_only = True, many = True)
user_ids = serializers.ListField(
child = serializers.IntegerField,
write_only = True
)
class Meta:
model = Schema
fields = ('week', 'users', 'user_ids',)
# remove create and update method
И в файле views.py,
class SchemaView(APIView):
permission_classes = (SchemaPermissions,)
def get(self, request):
...
def post(self, request):
data = request.data
serializer = SchemaSerializer(data=data)
if serializer.is_valid():
input_data = serializer.validated_data
week = input_data.get('week')
user_ids = input_data.get('user_ids')
if Schema.objects.filter(week = week).count() > 0:
schema = Schema.objects.get(week = week).first()
else:
schema = Schema.objects.create(week = week)
schema.users.set(user_ids)
schema.save()
return Response(SchemaSerializer(schema).data, status=status.HTTP_200_OK)
else:
return Response(status = status.HTTP_400_BAD_REQUEST)
И, конечно, данные полезной нагрузки должны быть
{'week': 23, 'user_ids': [1,2,3]}