首页 > 解决方案 > Django Rest Framework:字段名称“likes”对模型“userPost”无效配置不正确

问题描述

在我的 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()

最后是后序列化程序:

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

谢谢。

标签: djangodjango-modelsdjango-rest-framework

解决方案


你至少有三种方法。首先正如@WillemVanOnsem 所说,由many_to_one改变likeslike_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并将相关名称添加post ForeignKey

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()

推荐阅读