Как вернуть правильные поля модели в сериализаторе?

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

AttributeError: Получена ошибка AttributeError при попытке получить значение для поля username на сериализаторе SearchUserSerializer. Поле сериализатора может быть названо неверно и не соответствовать какому-либо атрибуту или ключу экземпляра Post. Первоначальный текст исключения был следующим: объект 'Post' не имеет атрибута 'username'.

Мои модели:

class User(AbstractUser):
    avi_pic = models.ImageField(
        max_length=400, null=True, blank=True, upload_to='images')
    name = models.CharField(max_length=50, blank=True, null=True)
    username = models.CharField(max_length=30, unique=True)

class Playlist(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, default=None
    )
    cover = models.CharField(max_length=300, default='', blank=True)
    title = models.CharField(max_length=300, default='', blank=True)
    date = models.DateTimeField(editable=False, auto_now_add=True)

Мои сериализаторы:

class SearchPostSerializer(serializers.ModelSerializer):
    username = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ('id', 'title', 'user', 'username', 'cover')

    def get_username(self, post):
        return post.user.username

class SearchUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'name', 'username', 'avi_pic')

и мой Views.py:

class SearchView(generics.ListAPIView):

    def get_serializer_class(self):
        queryset = self.get_queryset()
        if len(queryset) == 0:
            return None
        if isinstance(queryset[0], User):
            return SearchUserSerializer
        elif isinstance(queryset[0], Post):
            return SearchPostSerializer
        else:
            return None

    def get_queryset(self):
        query = self.request.query_params.get('q', None)
        if query is not None:
            queryset_users = User.objects.filter(
                Q(name__icontains=query) | Q(username__icontains=query))
            queryset_posts = Post.objects.filter(
                Q(playlist_title__icontains=query))
            results = list(queryset_users) + list(queryset_posts)
            return results
        else:
            return User.objects.none()

Я перепробовал много всего, но безуспешно. Благодарю за любую помощь!

Попробуйте это:

class SearchPostSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    class Meta:
        model = Post
        fields = ('id', 'title', 'user', 'username', 'cover')

Это должно помочь .

Вы можете удалить функцию get_username

Объяснение вы можете посмотреть здесь:

https://www.django-rest-framework.org/api-guide/fields/#source

Вернуться на верх