#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. Случается с лучшими из нас