Queryset получить данные внешнего ключа

У меня есть 2 модели (Пользователи и Сообщения)

class Users(models.Model):
    email = models.CharField(max_length=225)


class Posts(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE, default=1)
    type = models.TextField()

Я хочу включить email пользователя при получении всех сообщений. Я сделал следующее, но получаю только id пользователя.

class PostsViewSet(viewsets.ModelViewSet):
    serializer_class = PostsSerializer
    def get_queryset(self):
        queryset = Posts.objects.all()
        return queryset

Как я могу получить email пользователя в наборе запросов?

используйте https://docs.djangoproject.com/en/4.1/ref/models/querysets/#prefetch-related (не строго необходимо, но хорошая привычка), чтобы взять его из базы данных, используйте post.user.email, чтобы взять значение в коде. т.е.:

class PostsViewSet(viewsets.ModelViewSet):
    serializer_class = PostsSerializer
    queryset = Posts.objects.all().prefetch_related("user")


class PostsSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(source="user.email")
    ...

Вы можете аннотировать поле в кверисете:

from django.db.models import F

class PostsViewSet(viewsets.ModelViewSet):
    serializer_class = PostsSerializer
    def get_queryset(self):
        queryset = Posts.objects.annotate(user_email=F('user__email'))
        return queryset

Используйте всю мощь сериализаторов. https://www.django-rest-framework.org/api-guide/serializers/

class PostsViewSet(viewsets.ModelViewSet):
    serializer_class = PostsSerializer
    queryset = Posts.objects.all().prefetch_related("user")

class UserSerializer(serializers.ModelSerializer):
    class Meta:
         model = User
         fields = ('email')

class PostsSerializer(serializers.ModelSerializer):
    user = UserSerializer()
    
    class Meta:
         model = Post
         fields = ('type', 'user')
         depth = 1
Вернуться на верх