Я использую drf, основная проблема в том, что мое представление возвращает пустой json

#django #api #django-rest-framework #backend #rest

Вопрос:

Мое главное, что мое представление возвращает пустой json. Я хочу, чтобы мои блоги имели соответствующий идентификатор пользователя foreign_key.

 My models.py file

from django.db import models
# from django.contrib.auth.models import User
from django.utils import timezone
from datetime import datetime
from .validators import validate_allfile_extension
from restfapp.models import CustomUser
from django.contrib.auth.models import AbstractUser


CHOICE_GENDER = (('Male', 1), ('Female', 2), ('other', 3))

class CustomUser(AbstractUser):
    gender = models.TextField(choices=CHOICE_GENDER, null=True)
    birth_date = models.DateField(null=True, blank=True)
    
    class Blog(models.Model):
        title = models.TextField(max_length = 50)
        author = models.TextField(max_length = 50)
        description = models.TextField()
        date = models.DateField(auto_now=True)
        time = models.DateTimeField(default=datetime.now)
        image = models.ImageField(null=True, verbose_name="", validators=[validate_allfile_extension])
        user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
        
        def __str__(self):
            return self.title
 

Мой serializers.py файл

 class AddBlogSerializer(serializers.ModelSerializer):
    title = serializers.CharField(max_length=128,  write_only=True, required=True, error_messages={'blank': "Please provide title"} )
    author = serializers.CharField(max_length=128, write_only=True, required=True, error_messages={'blank': "Please provide author"})
    description = serializers.CharField(max_length=128,  write_only=True, required=True, error_messages={'blank': "Please provide description"})
    image = serializers.FileField(write_only=True, required=True, error_messages={'invalid': "Please upload image, video or audio file"})
    
    class Meta:
        model = Blog
        fields = ["title","author","description","image",]
 

Мой views.py файл

 @api_view(['GET', 'POST'])
# @csrf_exempt
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def blog(request):
    if request.method == 'GET':
        blogs_by_user_id = Blog.objects.filter(user_id=request.user.id).all()
        serializer = AddBlogSerializer(blogs_by_user_id, many=True)
        json_data = JSONRenderer().render(serializer.data)
        return Response(json_data, status=200) 
 

Мой Ответ:

 "[{},{},{},{},{}]"
 

Это дает мне пустой json, я хочу, чтобы мои блоги имели соответствующий идентификатор пользователя foreign_key.

Комментарии:

1. пожалуйста, приложите свой код сериализатора

2. Пожалуйста, никогда больше не копируйте-вставляйте один и тот же точный текст в свой вопрос несколько раз.

3. Привет, киран, я четко показываю свою проблему с файлом serilaizer на вкладке «Ответ», пожалуйста, просмотрите его еще раз. окк Джеймс

Ответ №1:

Это CustomUser твой AbstractBaseUser ?

Потому request.user что вернет аутентифицированный AbstractBaseUser .

Кстати, вы можете использовать request.user_id вместо request.user.id (вы делаете на 1 запрос меньше).

Для вас view.py я напишу так :

  • Использование BlogSerializer вместо AddBlogSerializer
  • Просто return serializer.data в этом нет необходимости JSONRenderer() , потому что это работа BlogSerializer
 def blog(request):
    if request.method == 'GET':
        blogs = Blog.objects.filter(user_id=request.user_id)
        serializer = BlogSerializer(blogs, many=True)
        Response(serializer.data, status=status.HTTP_200_OK)
 

Комментарии:

1. Это абстрактный пользователь, а не абстрактный пользователь

2. Теперь это дает мне пустой json, который не решает мою ошибку

3. Были ли у вас Blog записи в базе данных ?

4. Если я преобразую свой набор запросов в json. Это дает мне правильный ответ json, но этот json не очень хорош. Я хочу получить свои данные из serializer.data. Пожалуйста, помогите мне

5. Всем привет, я снова четко показываю свою проблему с файлом serilaizer на вкладке «Ответ», пожалуйста, просмотрите его еще раз. окк Джеймс

Ответ №2:

Сработало для меня лучшее решение, попробуйте:

write_only = True не позволяет сериализатору возвращать значения чтения. Подумайте о том, чтобы удалить его из любых полей, которые вы хотите вернуть своему клиенту.

Ваш сериализатор Должен быть:

класс AddBlogSerializer(сериализаторы.ModelSerializer): заголовок = сериализаторы.CharField(max_length=128, требуется=True, error_messages={«пусто»: «Пожалуйста, укажите название»} ) автор = сериализаторы.CharField(max_length=128, требуется=True, error_messages={«пусто»: «Пожалуйста, укажите автора»}) описание = сериализаторы.CharField(max_length=128, требуется=True, error_messages={«пусто»: «Пожалуйста, предоставьте описание»}) изображение = сериализаторы.Поле файла(обязательно=True, error_messages={«недопустимо»: «Пожалуйста, загрузите изображение, видео или аудиофайл»})

 class Meta:
    model = Blog
    fields = ["title","author","description","image",] 
 

Теперь он вернет ваши данные json