这是我的模特:
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。
答案 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)