使用主资源获取相关资源取决于django-rest

时间:2015-09-29 05:33:43

标签: django django-rest-framework

这是我的模特:

class Ratings(BaseModel):
    resource_a = models.OneToOneField(ResourceA)
    count = models.IntegerField(default=0)
    total = models.IntegerField(default=0)
    average = models.IntegerField(default=0)
    def __unicode__(self):
        return self.count


class UserRatings(BaseModel):
    user = models.ForeignKey(UserProfile)
    score = models.IntegerField()
    rating = models.ForeignKey(Ratings)
    def __unicode__(self):
        return self.user.username

我想获取ResourceA的评分,其中包含在相同API调用中登录的用户的评分。

我可以使用ModelSerializer获取ResourceA的评级,但无法获取登录用户的评级。

我尝试使用评级的ModelSerializer中的以下代码来执行此操作:

user_rating = serializer.CharField(source='get_user_rating')

但我只能在模型中编写 get_user_rating 函数,我认为无法在模型本身访问request.user。

请建议一种方法,以便我可以获取与评分一起登录的用户的UserRating。

1 个答案:

答案 0 :(得分:0)

您可以使用嵌套序列化程序获取1 api调用中的所有数据。 最简单的方法是在序列化器的Meta类中指定深度字段。

Class Meta:
    depth = 1

但它的缺点在于它会获取所有外国相关领域的所有数据,直到这个深度,即使你不是全部。

您可以尝试以下方法,我更喜欢

Class ResourceASerializer(serializers.ModelSerializer):
    rating = RatingSerializer()
    class Meta:
        model = UserRatings

Class RatingsSerializer(serializers.ModelSerializer):
    resource_a = ResourceASerializer()
    class Meta:
        model = Ratings

Class UserRatingSerializer(serializers.ModelSerializer):
    rating = RatingSerializer()
    class Meta:
        model = UserRatings

或者如果您不想制作3个序列化器:

Class UserRatingSerializer(serializers.ModelSerializer):
    resource_a_rating = serailizers.SerializerMethodField()
    class Meta:
        model = UserRatings
        fields = ('resource_a_rating', ) # add other fields too

    def get_resource_a_rating(self, obj):
        return obj.rating.resource_a // This data should be serializeable 

要仅为登录用户获取数据,请在视图中使用get_queryset方法。

def get_queryset(self):
    return UserRatings.objects.filter(user=self.request.user)