Как можно получить данные из родственной модели в Django Rest Framework? - PullRequest
0 голосов
/ 11 января 2020

У меня есть следующие модели

class User(AbstractUser):
    ip_address = models.CharField(max_length=15)

class Statistic(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='statistics')
    clicks = models.PositiveSmallIntegerField()

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

class UserListSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['id', 'first_name', 'ip_address']


class UserStatisticSerializer(serializers.ModelSerializer):
    class Meta:
        model = Statistic

Как я могу получить Response данные в следующих формат:

{
  'user_data': {
      'id': 1, 'first_name': 'name', ...,
      'statistics': [
          {'id': 1, 'clicks': 100},
          {'id': 3, 'clicks': 550}
      ]
}

I go на ссылку /api/v1/users/<int:pk>/ и вызов следующей функции:

class UserDetailStatisticApiView(RetrieveAPIView):
    queryset = ???
    serializer_class = ???

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 11 января 2020

Просмотр

class UserDetailStatisticApiView(RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserListSerializer
    lookup_fields = ['pk']
    fields = '__all__'

                                                                            `

Сериализаторы

class UserStatisticSerializer(serializers.ModelSerializer):
    class Meta:
        model = Statistic


class UserListSerializer(serializers.ModelSerializer):
    statistics = SerializerMethodField('get_statistics')
    class Meta:
        model = User
        fields = ['id', 'first_name', 'statistics']

    def get_statistics(self,obj):
        statistics = Statistic.objects.filter(user=obj)
        return  UserStatisticSerializer(statistics, many=True).data 
0 голосов
/ 11 января 2020

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

class StatisticSerializer(serializers.ModelSerializer):
    class Meta:
        model = Statistic
        fields = ['date', 'clicks', 'page_views']


class UserStatisticSerializer(serializers.ModelSerializer):
    statistics = StatisticSerializer(many=True)

    class Meta:
        model = User
        fields = [
            'first_name', 'last_name', 'gender', 'ip_address', 'statistics'
        ]

просмотров

class UserDetailStatisticApiView(RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserStatisticSerializer
...