TypeError: set() принимает 2 позиционных аргумента, но в фреймворке Django rest их было 3
У меня есть апи обновления, в котором я должен сначала удалить файлы изображений, а затем обновить другими новыми файлами изображений. Но когда я вызываю api, возникает вышеуказанная ошибка.
Мои модели:
class Gallery(TimeStampAbstractModel):
picture = VersatileImageField(
"Image",
upload_to=upload_path,
blank=True,
)
updated_at = None
class Meta:
ordering = ["created_at"]
class Articles(TimeStampAbstractModel):
creator = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.SET_NULL,
null=True,
related_name="articles",
)
title = models.CharField(max_length=255, blank=True)
tags = TaggableManager()
image_files = models.ManyToManyField(Gallery, related_name="articles")
content = models.TextField(blank=True)
video_content = models.URLField(max_length=255, blank=True)
post_views = models.IntegerField(default=0)
unique_visitors = models.ManyToManyField(
settings.AUTH_USER_MODEL, related_name="article_views"
)
launch_date = models.DateTimeField(null=True)
description = models.CharField(max_length=200, blank=True, default=None, null=True)
def __str__(self):
return self.title
Мое мнение:
class ArticlesView(viewsets.ModelViewSet):
queryset = Articles.objects.all()
serializer_class = ArticleSerializer
permission_classes = [IsAdminUser]
def update(self, request, *args, **kwargs):
instance = self.get_object()
print(instance)
files = request.FILES.getlist("image_files")
if files:
instance.image_files.all().delete()
for file in files:
image_content = Gallery.objects.create(picture=file)
instance.image_files.add(image_content.id)
partial = False
if "PATCH" in request.method:
partial = True
serializer = self.get_serializer(instance, data=request.data,partial=partial)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response(
{
"message": "Article has been updated.",
"updated_data": serializer.data,
},
status=status.HTTP_200_OK,
)
Мой сериализатор:
class ArticleSerializer(TaggitSerializer, serializers.ModelSerializer):
tags = TagListSerializerField(required=False)
image_files = GallerySerializer(many=True, read_only=True)
user = serializers.StringRelatedField(source="creator")
total_shares = serializers.FloatField(read_only=True)
total_reacts = serializers.FloatField(read_only=True)
bad_reacts = serializers.FloatField(read_only=True)
good_reacts = serializers.FloatField(read_only=True)
informative_reacts = serializers.FloatField(read_only=True)
launch_date = serializers.DateTimeField(required=True)
class Meta:
model = Articles
fields = [
"id",
"user",
"title",
"tags",
"image_files",
"content",
"video_content",
"post_views",
"launch_date",
"total_shares",
"total_reacts",
"bad_reacts",
"good_reacts",
"informative_reacts",
"description",
]
extra_kwargs = {
"image_files": {
"required": False,
}
}
def create(self, validated_data):
tags = validated_data.pop("tags", None)
instance = super(ArticleSerializer, self).create(validated_data)
if tags is not None:
for tag in tags:
instance.tags.add(tag)
instance.save()
return instance
Здесь я делаю частичное обновление, потому что из фронта может быть получено любое количество полей, это могут быть все поля или только некоторые поля. Но каждый раз я получаю эту ошибку. Код не выдает никаких ошибок (я поставил точки останова) до следующей части, но как только данные передаются в сериализатор, я получаю ошибки
"PATCH" in request.method:
partial = True
Traceback: