DRF:Api端点不会输出所有数据

时间:2018-07-18 18:23:57

标签: django django-rest-framework

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

InstagramGeograficsSerializer

int main() {
    std::vector<Foo> foos = get_foos();
    std::vector<Bar> bars = get_bars();

    std::vector<int> vec;
    auto merge = [](auto const& arg) {return arg.baz;};
    std::transform(foos.begin(), foos.end(), std::back_inserter(vec), merge);
    std::transform(bars.begin(), bars.end(), std::back_inserter(vec), merge);
}

InstagramEthnicSerializer

class InstagramGeograficsSerializer(serializers.ModelSerializer):
    city = InstagramGeoCitySerializer(read_only=True)

    class Meta:
        model = InstagramGeograficsAnalitics
        fields = ('city', 'percentage',)

InstagramDemographicsSerializer

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

InstagramSerializer

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

我的 views.py

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',)

最后,api仅提供有关种族的数据,而不包含有关地理人口统计

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

UPD模型Instagram

{
    "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": []
        }

InstagramEthnicAnalitics

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)

InstagramDemographicsAnalitics

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)

1 个答案:

答案 0 :(得分:2)

您必须告诉InstagramSerailizer在哪里为嵌套序列化器获取数据。

就像您为“种族”所做的一样(这就是返回它的原因)-您必须为其他两个字段指定相关名称。

因此在模型中:

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

同样,对于其他模型(您未包括在内)