Попытка сохранить несколько файлов в модели, ссылающейся на другую модель
Я пытаюсь загрузить несколько изображений в модель PostImage, которая ссылается на модель Post через foreignkey, чтобы пост мог содержать несколько изображений.
Вот модель поста:
class Post(models.Model):
slug = AutoSlugField(populate_from=["category", "created_at", "user"])
body = models.TextField("content", blank=True, null=True, max_length=5000)
video = models.FileField(
upload_to=user_directory_path, null=True, blank=True
)
user = models.ForeignKey(
User, on_delete=models.CASCADE, verbose_name="author", related_name="posts"
)
published = models.BooleanField(default=True)
pinned = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "post"
verbose_name_plural = "posts"
db_table = "posts"
ordering = ["created_at"]
def __str__(self):
return self.body[0:30]
def get_absolute_url(self):
return self.slug
Вот модель PostImage
class PostImage(models.Model):
image = models.ImageField(upload_to="posts/images", default='posts/default.png')
post = models.ForeignKey(Post, on_delete=models.DO_NOTHING)
class Meta:
db_table = "post_images"
ordering = ["post"]
Вот PostImageSerializer:
class PostImageSerializer(serializers.ModelSerializer):
class Meta:
model = PostImage
fields = ['id', 'image', 'post']
extra_kwargs = {
'post' : {'required', False}
}
и вот PostSerializer:
class PostSerializer(serializers.ModelSerializer):
images = PostImageSerializer(many=True, required=False)
class Meta:
model = Post
fields = [
"body",
"images",
"video",
"user",
"published",
"pinned",
"created_at",
"updated_at",
]
read_only_fields = ['slug']
def create(self, validated_data):
post = Post.objects.create(**validated_data)
try:
images_data = dict((self.context['request'].FILES).lists()).get('images', None)
for image in images_data:
PostImage.objects.create(image=image, post=post)
except:
PostImage.objects.create(post=post)
return Post
Вот набор представлений:
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
permission_classes = [permissions.IsAuthenticated]
serializer_class = PostSerializer
parser_classes = [MultiPartParser, FormParser]
#lookup_field = 'slug'
Когда я пытаюсь сохранить сообщение из фронт-энда (Vue 3), я получаю ошибку, о которой не могу найти упоминания в Интернете.
Ошибка:
value = attribute_instance.serializable_value(self.source_attrs[-1])
TypeError: serializable_value() missing 1 required positional argument: 'field_name'
Вот трассировка:
Internal Server Error: /api/v1/posts/create/
Traceback (most recent call last):
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/mixins.py", line 20, in create
headers = self.get_success_headers(serializer.data)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/serializers.py", line 555, in data
ret = super().data
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/serializers.py", line 253, in data
self._data = self.to_representation(self.instance)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/serializers.py", line 509, in to_representation
attribute = field.get_attribute(instance)
File "/home/calvin/.local/share/virtualenvs/website-OCaWupbT/lib/python3.8/site-packages/rest_framework/relations.py", line 175, in get_attribute
value = attribute_instance.serializable_value(self.source_attrs[-1])
TypeError: serializable_value() missing 1 required positional argument: 'field_name'
Я не могу найти другую страницу в Интернете, которая ссылается на точно такую же ошибку, поэтому немного потерялся.