0

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 中的一个问题。

提前致谢!

4

1 回答 1

2

您的查询中有两个=。你应该只有一个:

obj.sample_model_votes.filter(user_who_voted=self.context['request'].user).get().vote

因为你使用了两个,Python 认为它是比较和评估user_who_voted作为一个变量。由于您没有该变量,因此您有此错误。

于 2020-11-23T18:42:40.977 回答