【问题标题】:Django Rest Framework: field name 'likes' is not valid for model 'userPost' improperlyConfiguredDjango Rest Framework:字段名称“likes”对于模型“userPost”无效配置不正确
【发布时间】:2018-11-14 01:20:33
【问题描述】:

在我的 Django Rest Framework api 中,我尝试向我的模型 UserPosts 添加一个属性,该属性返回所有喜欢的帖子。尽管我尽了最大的努力,但我仍然遇到这个错误。下面是我的帖子模型:

class UserPosts(models.Model):
    userProfile = models.ForeignKey(UserProfile, related_name="posts", on_delete=models.CASCADE)
    image = models.ImageField()
    caption = models.CharField(max_length=240)

    @property
    def get_likes(self):
        from liked.models import Like
        return Like(post=self)

这是我喜欢的模型:

class Like(models.Model):
    user = models.OneToOneField(UserProfile, on_delete=models.CASCADE,)
    post = models.ForeignKey(UserPosts, on_delete=models.CASCADE)
    liked_at = models.DateTimeField()

最后是 post 序列化器:

class postSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.UserPosts
        fields = ('userProfile', 'image', 'caption', 'likes')

谢谢。

【问题讨论】:

  • postSerializer 中的like_set 替换likes(你最好修正一下这种命名风格)。
  • @WillemVanOnsem 非常感谢。我没有足够的代表来支持你,否则我会。

标签: django django-models django-rest-framework


【解决方案1】:

你至少有三种方法。首先正如@WillemVanOnsem 所说,由many_to_onelikes 更改为like_set

class postSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = models.UserPosts
        fields = ('userProfile', 'image', 'caption', 'like_set')
        #                                             ^^^^^

第二次将模型的属性重命名为likes 并修复其中的查询集

class UserPosts(models.Model):
    userProfile = models.ForeignKey(UserProfile, related_name="posts", on_delete=models.CASCADE)
    image = models.ImageField()
    caption = models.CharField(max_length=240)

    @property
    def likes(self):
    #   ^^^^^
        from liked.models import Like
        return Like.objects.filter(post=self).values() or []
        # solution you try ^^^^^^^
        return self.like_set.values() or []
        # more django way

第三,对我来说最简单优雅的方法是删除您的get_likes并将related_name添加到postForeignKey

class Like(models.Model):
    user = models.OneToOneField(UserProfile, on_delete=models.CASCADE,)
    post = models.ForeignKey(UserPosts, related_name='likes', on_delete=models.CASCADE)
    #                                    ^^^^^^^^^^^
    liked_at = models.DateTimeField()

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2020-12-19
    • 2020-01-12
    • 1970-01-01
    • 2020-08-16
    • 2018-03-11
    • 1970-01-01
    • 2016-06-26
    • 2016-03-06
    相关资源
    最近更新 更多