我有两个模型(和匹配的序列化程序):
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
