Skip to main content
 首页 » 编程设计

python之Django 休息 : serializer field that isn't a model field

2024年08月25日28oomusou

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

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 Book 中添加一个字段(伪代码):

has_been_read_by = if_exists_in_readby display 'true' else 'false' 

因此我需要检查 ReadBy 数据库中是否存在记录,如果存在则显示 true 或 false。

谢谢。

请您参考如下方法:

要点是,在您的 Book 模型的序列化程序方法中,您可以访问 context 提供 context['request'].user 和 obj 表示 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() 

该字段将包含 True 或 False 作为 bool 值,它们将被转换为您的 REST 格式,例如JSON(或者您可以同样轻松地返回 true 和 false 字符串)

现在在您的 ViewSet 中使用它,例如

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