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

时间:2015-07-21 19:53:17

标签: python django django-rest-framework

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

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 个答案:

答案 0 :(得分: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字符串)

现在在ViewSet例如

中使用它
class BookViewSet(viewsets.ModelViewSet):
    model = Book
    serializer_class = BookSerializer