Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST:不是模型字段的序列化程序字段_Python_Django_Django Rest Framework - Fatal编程技术网

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