Как я могу переписать эти 2 просмотра в 1 просмотр? - PullRequest
1 голос
/ 21 января 2020

Как мне переписать эти 2 вида в 1 вид?

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

class UserSerializer(serializers.ModelSerializer):​
    class Meta:
        model = User
        fields = [
            'id', 'first_name', 'last_name', 'email', 'gender', 'ip_address',
        ]
​
​
class StatisticSerializer(serializers.ModelSerializer):
    class Meta:
        model = Statistic
        fields = ['clicks', 'page_views', 'date']
​
​
class UserStatisticSerializer(serializers.Serializer):
    user = serializers.SerializerMethodField()
    max_date = serializers.SerializerMethodField()
    min_date = serializers.SerializerMethodField()

    def to_representation(self, instance):
        ...
        return data

просмотров

class UserListApiView(ListAPIView):
    serializer_class = UserSerializer
    queryset = User.objects.all()
    pagination_class = UsersSetPagination
​
​
class StatisticAPIView(RetrieveAPIView):
    serializer_class = UserStatisticSerializer
    queryset = User.objects.all()

модели

class User(AbstractUser):
    username = models.CharField(max_length=40, blank=True, null=True)
    email = models.EmailField(unique=True, db_index=True)
    gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default=GENDER_MALE)
    ip_address = models.GenericIPAddressField()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']


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

Ответы [ 2 ]

0 голосов
/ 21 января 2020
  1. Переопределите APIViews на GenericAPIView с помощью ModelMixins и переопределите get_serializer_class с помощью action
class UsersAPIView(ListModelMixin, RetrieveModelMixin, GenericViewSet):
    queryset = User.objects.all()
    pagination_class = UsersSetPagination

    def get_serializer_class(self):
        if self.action == 'list':
            serializer = UserSerializer
        elif self.action == 'retrieve':
            serializer = UserStatisticSerializer
        return serializer
Зарегистрируйте эти конечные точки в urls
router = SimpleRouter()
router.register(r'', UsersAPIView)

urlpatterns = [
    url(r'', include(router.urls)),
]
0 голосов
/ 21 января 2020

Полагаю, если бы вы определили свой UserStatisticSerializer таким образом, вы бы достигли своей цели:

class UserStatisticSerializer(serializers.Serializer):
    user = serializers.SerializerMethodField()      # not sure on these fields
    max_date = serializers.SerializerMethodField()  # not sure on these fields
    min_date = serializers.SerializerMethodField()  # not sure on these fields


    statistics = StatisticSerializer(many=True) # <---

    class Meta:
            model = User
            fields = [
                'id', 'first_name', 'last_name', 'email', 'gender', 'ip_address',
                'statistics' # <---
            ]
...