Как вернуть правильные поля модели в сериализаторе?
Я реализую строку поиска, которая возвращает пользователей и сообщения. Я могу вернуть данные, но когда я очищаю строку поиска, я получаю ошибку:
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