我有两个模型(和匹配的序列化程序):
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,如果是这样的话。
感谢。
答案 0 :(得分:3)
外卖是,在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
作为布尔值,它将被转换为您的REST格式,例如: JSON(或者您可以轻松返回true
和false
字符串)
现在在ViewSet
例如
class BookViewSet(viewsets.ModelViewSet):
model = Book
serializer_class = BookSerializer