代码之家  ›  专栏  ›  技术社区  ›  Jekson

drf:api端点不输出所有数据

  •  1
  • Jekson  · 技术社区  · 6 年前

    使用django rest framework创建的api端点不会输出所有序列化数据。

    InstagramGeoGraficsSerializer公司

    class InstagramGeograficsSerializer(serializers.ModelSerializer):
        city = InstagramGeoCitySerializer(read_only=True)
    
        class Meta:
            model = InstagramGeograficsAnalitics
            fields = ('city', 'percentage',)
    

    instagramethnicserializer软件

    class InstagramEthnicSerializer(serializers.ModelSerializer):
        class Meta:
            model = InstagramEthnicAnalitics
            fields = ('language', 'percentage',)
    

    instagramdemographicsserializer软件

    class InstagramDemographicsSerializer(serializers.ModelSerializer):
        class Meta:
            model = InstagramDemographicsAnalitics
            fields = ('age_group', 'gender', 'percentage', 'full_percentage',)
    

    Instagramseriazer公司

    class InstagramSerializer(serializers.HyperlinkedModelSerializer):
        geographics = InstagramGeograficsSerializer(many=True, read_only=True)
        demographics = InstagramDemographicsSerializer(many=True, read_only=True)
        ethnic = InstagramEthnicSerializer(many=True, read_only=True)
    
        class Meta:
            model = Instagram
            fields = ('id', 'userid', 'username', 'full_name', 'avatar', 'bio',
                      'website', 'media_count', 'follows_count',
                      'subscriber_count', 'engagement_rate', 'approval_rate',
                      'discussion_rate', 'male_percentage', 'female_percentage', 'geographics', 'demographics', 'ethnic',)
    

    我的 视图.py

    class InstagramDetail(generics.RetrieveAPIView):
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
        queryset = Instagram.objects.all()
        serializer_class = InstagramSerializer
    

    最后,api只提供 民族的 ,并且不包含 地理 人口统计学的

    {
        "count": 2,
        "next": null,
        "previous": null,
        "results": [
            {
                "id": 2,
                "userid": "3045727148",
                "username": "test2",
                "full_name": "full name",
                "avatar": "",
                "bio": "23",
                "website": "",
                "media_count": 0,
                "follows_count": 0,
                "subscriber_count": 0,
                "engagement_rate": "0.0000000",
                "approval_rate": "0.0000000",
                "discussion_rate": "0.0000000",
                "male_percentage": "0.000",
                "female_percentage": "0.000",
                "ethnic": []
            }
    

    upd模型instagram

    class Instagram(models.Model):
        class Meta:
            permissions = (
                ('view_all_instagram', 'Can view all instagram'),
                ('change_all_instagram', 'Can change all instagram'),
            )
    
        credential = CredentialsField()
        userid = models.CharField(max_length=255, unique=True)
    
        platform = GenericRelation(Platform,
                                   related_query_name='instagram_platform',
                                   content_type_field='content_type',
                                   object_id_field='object_id')
    
        username = models.CharField(max_length=50, blank=True, null=True)
        full_name = models.CharField(max_length=50, blank=True, null=True)
        avatar = models.URLField(max_length=512, blank=True, null=True)
        bio = models.CharField(max_length=255, blank=True, null=True)
        website = models.URLField(max_length=255, blank=True, null=True)
        city = models.CharField(max_length=255, blank=True, null=True)
        media_count = models.PositiveIntegerField(blank=True, default=0)
        follows_count = models.PositiveIntegerField(blank=True, default=0)
        subscriber_count = models.PositiveIntegerField(blank=True, default=0)
        engagement_rate = models.DecimalField(default=0, max_digits=14, decimal_places=7)
        approval_rate = models.DecimalField(default=0, max_digits=14, decimal_places=7)
        discussion_rate = models.DecimalField(default=0, max_digits=14, decimal_places=7)
        male_percentage = models.DecimalField(default=0, max_digits=5, decimal_places=3)
        female_percentage = models.DecimalField(default=0, max_digits=5, decimal_places=3)
    

    Instagramethanitics公司

    class InstagramEthnicAnalitics(models.Model):
        class Meta:
            permissions = (
                (
                    'view_all_instagram_ethnic_analytics',
                    'Can view all_instagram_ethnic_analytics'
                ),
                (
                    'change_all_instagram_ethnic_analytics',
                    'Can change all_instagram_ethnic_analytics'
                ),
            )
    
        instagram = models.ForeignKey(Instagram, related_name='ethnic')
        language = models.CharField(max_length=20)
        percentage = models.DecimalField(default=0, max_digits=5, decimal_places=3)
    

    instagramdemographicsanalitics公司

    class InstagramDemographicsAnalitics(models.Model):
        class Meta:
           #unique_together = (('instagram', 'age_group', 'gender', ),)
            permissions = (
                (
                    'view_all_instagram_demographics_analytics', 
                    'Can view all_instagram_demographics_analytics'
                ),
                (
                    'change_all_instagram_demographics_analytics',
                    'Can change all_instagram_demographics_analytics'
                ),
            )
        instagram = models.ForeignKey(Instagram)
        age_group = models.CharField(max_length=50)
        gender = models.CharField(max_length=10, default='female')
        percentage = models.DecimalField(default=0, max_digits=5, decimal_places=3)
        is_full_gender = models.BooleanField(default=False)
        full_percentage = models.DecimalField(default=0, max_digits=5, decimal_places=2)
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Enthusiast Martin    6 年前

    您必须告诉instagramseralizer在何处获取嵌套序列化程序的数据。

    就像你对你的“种族”做的那样(这就是为什么它会被返回),你必须为其他两个字段指定相关的名称。

    所以在模型中:

    class InstagramDemographicsAnalitics(models.Model):
        instagram = models.ForeignKey(Instagram, related_name="demographics")
    

    对于另一个模型(您没有包括在内)也是如此