首页 文章

Django REST:不是模型字段的序列化器字段

提问于
浏览
2

我有两个模型(和匹配的序列化器):

class Book(models.Model):
   created = models.DateTimeField(auto_now_add=True)
   owner = models.ForeignKey(MyUser)
   title = models.CharField(max_length=100, blank=True, default='')
   author = models.CharField(max_length=100, blank=True, default='')

class ReadBy(models.Model):
   created = models.DateTimeField(auto_now_add=True)
   owner = models.ForeignKey(MyUser)

阅读完本书后,它将存储在ReadBy数据库中 . 当用户使用Book model / serializer检索书籍时,我想要一个字段告诉我该特定用户是否已阅读该书 .

即我想在Model Book中添加一个字段(伪代码):

has_been_read_by = if_exists_in_readby display 'true' else 'false'

所以我需要检查ReadBy数据库中是否存在记录,然后显示true或false,如果是这样的话 .

谢谢 .

1 回答

  • 3

    需要注意的是,在 Book 模型的序列化方法中,您可以访问 context ,它提供 context['request'].userobj ,表示 Book 对象

    我会假设您的 ReadBy 有一个FK到 Book ,否则你不清楚如何将它们连接在一起

    class ReadBy(models.Model):
       created = models.DateTimeField(auto_now_add=True)
       owner = models.ForeignKey(MyUser)
       book = models.ForeignKey(Book)
    

    我们来做一个 BookSerializer

    class BookSerializer(serializers.ModelSerializer):
        class Meta:
            model = Book
    
        has_been_read_by = serializers.SerializerMethodField('get_has_been_read_by')
    
        def get_has_been_read_by(self, obj):
            user = self.context['request'].user
            book = obj
    
            # See if a ReadBy object exists
            return ReadBy.objects.filter(book=book, owner=user).exists()
    

    该字段将包含 TrueFalse ,作为布尔值,将转换为您的REST格式,例如JSON(或者您可以轻松返回 truefalse 字符串)

    现在在你的_1260426中使用它,例如

    class BookViewSet(viewsets.ModelViewSet):
        model = Book
        serializer_class = BookSerializer
    

相关问题