Обратное отношение DRF невозможно отфильтровать в сериализаторе

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Возникла интересная проблема с 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 я могу легко извлечь экземпляр / элемент 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.

Заранее спасибо!

Ответ №1:

= В вашем запросе есть два из них. У вас должен быть только один:

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

Поскольку вы использовали два, Python считает, что это сравнение и оценка user_who_voted как переменная. Поскольку у вас нет этой переменной, у вас есть эта ошибка.

Комментарии:

1. Я не идиот — просто опечатка с моей стороны, которую я пропустил, несмотря на то, что смотрел тысячу раз. Действительно, сижу здесь, думая, что что-то сломалось с DRF. Спасибо!

2. Случается с лучшими из нас