Python Django REST:不是模型字段的序列化程序字段
我有两个模型和匹配的序列化程序:Python Django REST:不是模型字段的序列化程序字段,python,django,django-rest-framework,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, blan
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数据库中。当用户使用图书模型/序列化程序检索图书时,我希望有一个字段告诉我该特定用户是否读过该书
也就是说,我想在模型手册伪代码中添加一个字段:
has_been_read_by = if_exists_in_readby display 'true' else 'false'
因此,我需要检查ReadBy数据库中是否存在记录,如果存在,则显示true或false
谢谢。在图书模型的序列化器方法中,您可以访问提供上下文['request']的上下文。user和代表图书对象的obj 我假设你的ReadBy有一个FK to Book,否则不清楚你是如何将它们链接在一起的
class ReadBy(models.Model):
created = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(MyUser)
book = models.ForeignKey(Book)
让我们做一个书店
该字段将包含布尔值形式的True或False,它们将被转换为您的REST格式,例如JSON,或者您可以同样轻松地返回True和False字符串
现在在视图集中使用它,例如
我不知道怎么读这本书。如果我试图写一篇文章来添加一个ReadBy,它会告诉我需要指定book\u id:1048,当我指定它告诉我的book\u id时,“book\u id”列不能为null。例如,try Django似乎试图自动添加该字段,但失败。@Henrik我认为该部分取决于您为ReadBy使用的序列化程序,例如,它可能希望文章包含完整的book字段,或者它可能只接受一个ID。没有代码很难说,如果您提出问题,我很乐意看一看!好的,谢谢。我这样做了。我希望这是可以理解的:-
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()
class BookViewSet(viewsets.ModelViewSet):
model = Book
serializer_class = BookSerializer