【问题标题】:Django Rest Framework, getting error : 'NoneType' object has no attributeDjango Rest Framework,出现错误:“NoneType”对象没有属性
【发布时间】:2020-08-21 21:05:32
【问题描述】:

我创建了一个博客,人们可以在其中发帖、评论和喜欢发帖。当我发布新帖子时,在 /api/posts/ 'NoneType' object has no attribute 'user' 处出现错误 AttributeError ,在第 20 行 get_user_has_voted 中的 serializers.py 处发生错误。

即使出现错误,我也可以发布数据并且所有其他功能都可以正常工作。

为什么会发生错误?如何调试?

序列化器.PY

class PostSerializers(serializers.ModelSerializer):
    comments = serializers.HyperlinkedRelatedField(many=True,read_only=True,view_name = 'comment_details')
    likes_count = serializers.SerializerMethodField()
    user_has_voted = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = '__all__'
        #exclude=('voters',)

    def get_likes_count(self, instance):
        return instance.voters.count()

    def get_user_has_voted(self, instance):
        request = self.context.get("request")
        return instance.voters.filter(pk=request.user.pk).exists()  # line 20

模型.PY

class Post(models.Model):
    title = models.CharField(max_length=60)
    body = models.CharField(max_length=60)
    file = models.FileField(null=True,blank=True)
    voters = models.ManyToManyField(settings.AUTH_USER_MODEL,
                                    related_name="votes",null=True,blank=True)

堆栈溢出中有重复的问题,但场景不同,作为初学者我无法理解。

【问题讨论】:

  • 因为context 没有request
  • 你可以用pdb或者pudb调试它。 pip install pudb 然后将这一行放在任何你想休息的地方:import pudb; pudb.set_trace()
  • @WillemVanOnsem 我可以忽略这个错误吗?
  • @RossRogers 谢谢我会试试的

标签: python django django-rest-framework


【解决方案1】:

您需要通过上下文将您的请求传递给序列化程序。

serializer = PostSerializers(instance, context={'request': request})

无论如何,我强烈不建议这样做。序列化器用于序列化数据,而不是用于您的业务逻辑或验证。

如果它是您业务逻辑的一部分,请考虑在 services.py 中排除它。

【讨论】:

  • 谢谢Mr.Marker,我在views.py中添加了代码你为什么不推荐它?
  • 因为您正在根据授权用户获得选民。这是一个相当商业逻辑或验证(我看不出它在哪里使用)。最佳做法是将业务逻辑排除在 services.py 中。
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 2015-10-15
  • 2019-04-30
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2018-09-13
相关资源
最近更新 更多