#django #serialization #django-rest-framework
#django #сериализация #django-rest-framework
Вопрос:
Я уже некоторое время борюсь с этим.
В моем js-коде я извлекаю с помощью запроса get все записи, сделанные пользователями. В моем коде django я запрашиваю базу данных для указанных сообщений. Когда я получаю набор результатов запроса, он передается в js-код, где я пытаюсь получить доступ к автору каждого объекта (пользователю, который его опубликовал), чтобы отобразить его. Но вместо этого мне присвоен pk, а не имя пользователя.
Итак, в принципе, я не знаю, как получить имя пользователя в качестве автора (пользователя, который сделал сообщение) каждого объекта, вместо pk.
models.py:
class Post(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE) ##
content = models.TextField(max_length=400, blank=False)
date_posted = models.DateTimeField(auto_now_add=True)
@property
def username(self):
return self.author.username
def __int__(self):
return self.
serializers.py :
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = '__all__'
js код:
function show_posts(sort) {
fetch(`api/post-list/${sort}`)
.then(response => response.json())
.then(posts => {
//for each email
console.log(posts);
posts.forEach(post => update_posts(post, sort));
});
}
function update_posts(post, sort) {
const element = document.createElement('div');
element.setAttribute("class", "post-dv");
console.log(post);
element.innerHTML = "Author: " post.author "<br>";
element.innerHTML = "Content: " post.content "<br>";
element.innerHTML = "Date: " post.date_posted "<br>";
element.innerHTML = "Likes: 0" "<br>";
document.querySelector('#posts-view').append(element);
}
views.py функция:
@api_view(['GET'])
def postList(request, sort):
if sort == "all":
posts = Post.objects.all().order_by('-date_posted')
for post in posts:
username = User.objects.get(username=post.author)
post.author = username
#print(post.author)
else:
try:
user = User.objects.get(username=sort)
posts = Post.objects.filter(author=user).order_by('-date_posted')
except User.DoesNotExist:
#return JsonResponse({"error": "User doesn't exist."}, status=400)
return Response(status=status.HTTP_400_BAD_REQUEST)
print(f"POSTS: {posts}")
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
в views.py serializer.data выглядит следующим образом. Могу ли я изменить значение автора только путем просмотра записей с циклами? Или я могу как-то изменить что-то еще?
[OrderedDict([(‘id’, 18), (‘content’, ‘nn’), (‘date_posted’, ’08/13/2020 08:54:23′), (‘ автор’, 1)]), OrderedDict([(‘id’, 17), (‘content’, ‘M’), (‘date_posted’, ’08/13/2020 08:42:21′), (‘ автор’, 1)]), OrderedDict([(‘id’, 16), (‘content’, ‘6’), (‘date_posted’, ’08/13/2020 08:27:42′), (‘ автор’, 1)]), OrderedDict([(‘id’, 15), (‘content’, ‘1’), (‘date_posted’, ’08/12/2020 19:24:54′), (‘ автор’, 1)]), OrderedDict([(‘id’, 14), (‘content’, ’11’), (‘date_posted’, ’08/12/2020 19:24:23′), (‘ автор’, 1)]), OrderedDict([(‘id’, 13), (‘content’, ‘222’), (‘date_posted’, ’08/12/2020 19:23:48′), (‘ автор’, 1)]), OrderedDict([(‘id’, 12), (‘content’, ’33’), (‘date_posted’, ’08/12/2020 19:23:31′), (‘ автор’, 1)]), OrderedDict([(‘id’, 11), (‘content’, ‘4’), (‘date_posted’, ’08/12/2020 19:23:09′), (‘ автор’, 1)]), OrderedDict([(‘id’, 10), (‘content’, ’11’), (‘date_posted’, ’08/12/2020 19:21:48′), (‘ автор’, 1)]), OrderedDict([(‘id’, 9), (‘content’, ‘1’), (‘date_posted’, ’08/12/2020 19:19:32′), (‘ автор’, 1)]), OrderedDict([(‘id’, 8), (‘content’, ‘5’), (‘date_posted’, ’08/12/2020 19:18:34′), (‘ автор’, 1)]), OrderedDict([(‘id’, 7), (‘content’, ‘4’), (‘date_posted’, ’08/12/2020 19:18:10′), (‘ автор’, 1)]), OrderedDict([(‘id’, 6), (‘content’, ‘7’), (‘date_posted’, ’08/12/2020 19:17:10′), (‘ автор’, 1)]), OrderedDict([(‘id’, 5), (‘content’, ‘5’), (‘date_posted’, ’08/12/2020 19:13:54′), (‘ автор’, 1)]), OrderedDict([(‘id’, 4), (‘content’, ‘7’), (‘date_posted’, ’08/12/2020 19:10:11′), (‘ автор’, 1)]), OrderedDict([(‘id’, 3), (‘content’, ‘2’), (‘date_posted’, ’08/12/2020 18:46:23′), (‘ автор’, 1)]), OrderedDict([(‘id’, 2), (‘content’, ‘6’), (‘date_posted’, ’08/12/2020 18:33:55′), (‘ автор’, 1)]), OrderedDict([(‘id’, 1), (‘content’, ‘0’), (‘date_posted’, ’08/12/2020 13:59:46′), (‘ автор’, 1)])]
Ответ №1:
Вы можете обновить свой сериализатор следующим образом (используя SerializerMethodField
):
class PostSerializer(serializers.ModelSerializer):
username = serializers.SerializerMethodField()
class Meta:
model = Post
fields = '__all__'
def get_username(self, obj):
return obj.username
Что позволит вам получить доступ к username
значению из объекта.
Также существуют альтернативные решения, такие как использование source
:
class PostSerializer(serializers.ModelSerializer):
username = serializers.CharField(source='username')
Комментарии:
1. Спасибо за ответ! Я изменил код, но он возвращает те же результаты. Итак, что происходит, так это то, что я передаю объекты «posts = Post.objects.all ()» сериализатору, и obj.username в вашем коде должен получить доступ к указанному имени пользователя, верно? Разве это не должно быть obj.author.username? в любом случае он возвращает одно и то же. Или я должен передавать каждый объект сериализатору по одному за раз? Вроде как пытался это сделать, но возвращал странные результаты. И последнее, SerializerMethodField добавляет новое поле?
2.
obj.username
должно работать, поскольку у вас есть метод свойств вPosts
модели.SerializerMethodField
добавляет поле. Кстати, откуда вы получаете OrderDicts?3. Из serializer = PostSerializer(posts, many = True), путем печати serializer.data. (последние две строки в views.py ) Данные, которые я должен передать в js-код для отображения сообщений.
4. я редактировал неправильные модели amp; serializers.py файлы lmao. работает, спасибо!