Передача поля CharField в поле ArrayField из React в Django с помощью Axios
Я пытаюсь создать функцию, в которой если пользователь пишет сообщение, то ID сообщения попадает в поле ArrayField в модели User, чтобы можно было получить доступ к списку написанных им сообщений.
Я ввел новый столбец в базу данных User, сделал необходимые миграции и опробовал эту функцию, просто сохранив один ID поста, который работал нормально. Проблема возникла, когда я сделал поле модели ArrayField. Теперь при выполнении POST-запроса я получаю ошибку
response
:
"{\"posts_written\":{\"0\":[\"Expected a list of items but got type \\\"str\\\".\"]}
В настоящее время я пишу ЗАПРОС как
let newPost = new FormData()
newPost.append('title', title)
newPost.append('content', content)
updatePostList.append('posts_written', id + ',')
await API.patch(`/profile/user/${loggedInProfile.id}/update/`, updateArticleList, {
headers: {
'Authorization': `Token ${sessionToken}`,
'Content-Type': 'multipart/form-data',
},
})
Я не знаю, как написать POST-запрос для работы с ArrayField, я искал ответы в Интернете, но ничего не нашел.
Я также пытался обернуть id
в объектные скобки JS, но это не помогло. Используя панель Django Admin, я увидел, что ручное добавление к полю articles_written
и разделение значений символом ,
сохраняет их в отдельном индексе массива, поэтому я добавил ,
к id
. Однако сейчас у меня нет идей.
Вот модель пользователя, если это поможет
class User(AbstractUser):
id = models.CharField(max_length=36, default=generate_unique_id, primary_key=True)
username = models.CharField(max_length=250, unique=True)
profile_image = models.ImageField(upload_to='profile_images', default='/profile_images/DefaultAvatar.png')
bio = models.CharField(max_length=500, default='', blank=True, null=True)
display_name = models.CharField(max_length=250, blank=True, null=True)
articles_written = ArrayField(
ArrayField(models.CharField(max_length=36, blank=True, null=True)),
)
Спасибо
После нескольких часов я наконец-то нашел решение, поэтому публикую на случай, если кто-то столкнется с этим в будущем
Я отказался от попыток сделать это из фронтенда и решил, что будет более эффективно, если модель User
можно будет обновлять из бэкенда.
Я добавил поле ForeignKey
в модель Post, чтобы имитировать отношения "один ко многим".
class Post(models.Model)::
id = models.CharField(max_length=36, default=gen_uuid, primary_key=True)
content = models.TextField(default='content')
author = models.ForeignKey(User, on_delete=models.CASCADE)
Затем в сериализаторе User я добавил новое поле, запросив набор Post.
class UserSerializer(serializers.ModelSerializer):
post_set = PostSerializer(many=True, read_only=True)
class Meta:
fields = (
'id',
'username',
'post_set'
)
model = User