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