DRF 有一个有趣的问题,想知道是否有人有任何想法。
举个简单的例子,以这两个 Django 模型为例:
class Vote(models.Model):
user_who_voted = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
vote = models.IntegerField(choices = [(-1, "down"), (1, "up")])
timestamp_voted = models.DateTimeField(auto_now = True)
sample_model = models.ForeignKey('SampleModel', on_delete=models.CASCADE, related_name = 'sample_model_votes')
class Meta:
constraints = [models.UniqueConstraint(fields=['user_who_voted', 'sample_model_id'], name='one_vote_pp_sample_model')]
class SampleModel (models.Model):
#does some stuff
在序列化 SampleModel 时,我希望能够获取vote请求用户的值(保证只有一票,如果有的话)。
在 Django shell 中,我可以轻松提取 SampleModel 的实例/项目:
samplemodelexample = SampleModel.objects.get(pk = 1)
然后我可以遍历反向关系Vote成功返回vote值:
samplemodelexample.sample_motel_votes.filter(user_who_voted_id = 1).get().vote
将完全相同的代码(简化以显示相关部分)放入 DRF 似乎会产生一个问题:
class SampleModelSerializer(serializers.ModelSerializer):
user_vote = serializers.SerializerMethodField()
class Meta:
model = SampleModel
fields = ['user_vote']
read_only_fields = fields
def get_user_vote(self, obj):
try:
vote = obj.sample_model_votes.filter(user_who_voted == self.context['request'].user).get().vote #stacktrace on this line
return f"{vote}"
except:
traceback.print_exc()
return '0'
我收到一条错误消息,表明NameError: name 'user_who_voted' is not defined
有谁知道为什么?
作为一些额外的背景:在实践中,当然会有很多用户和很多选票,但是如果我只在Vote表格中投一票,那么将产生错误的行替换SampleModelSerializer为
vote = obj.sample_model_votes.first().vote
返回 的正确值vote。总之,这似乎是.filter()DRF 中的一个问题。
提前致谢!