代码之家  ›  专栏  ›  技术社区  ›  Henrik

如果在Django中将id指定为ForeignKey,则无法发布指定特定id的条目

  •  2
  • Henrik  · 技术社区  · 9 年前

    我有两种型号, Book ReadBy 如models.py中所述:

    class Book(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        owner = models.ForeignKey(MyUser)
    
    class ReadBy(models.Model):
        created = models.DateTimeField(auto_now_add=True)
        owner = models.ForeignKey(MyUser)
        book = models.ForeignKey(Book)
    

    视图.py:

    class BookViewSet(viewsets.ModelViewSet):
        queryset = Book.objects.all()
        serializer_class = BookSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    
        def pre_save(self, obj):
            obj.owner = self.request.user
    
    class ReadByViewSet(viewsets.ModelViewSet):
        queryset = ReadBy.objects.all()
        serializer_class = ReadBySerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
    
        def pre_save(self, obj):
            obj.owner = self.request.user
    

    序列化程序.py:

    class BookSerializer(serializers.ModelSerializer):
        readby = serializers.SerializerMethodField('get_ready_by')
    
        def get_read_by(self, obj):
            user = self.context['request'].user
            book = obj
            return ReadBy.objects.filter(book=book, owner=user).exists()
    
        class Meta:
            model = Book
            fields = ('id', 'created', 'owner', 'readby')
    
    class ReadBySerializer(serializers.ModelSerializer):
        owner = serializers.Field(source='owner.id')
        book = serializers.Field(source='book.id')
    
        class Meta:
            model = ReadBy
            fields = ('id', 'created', 'owner', 'book')
    

    书是一本 ForeignKey 在里面 ReadBy(读取者) 。原因是我想通过定义 readby BookSerializer中的字段设置为true或false。

    现在,当我尝试POST ReadBy项时,我无法显式设置book_id,即使我尝试了,我仍然会收到相同的错误:

    “列'book_id'不能为空”

    我需要知道的是如何明确指定book_id,以便能够“阅读”一本书。

    谢谢

    2 回复  |  直到 9 年前
        1
  •  0
  •   Chris Curvey    9 年前
    class ReadBy(models.Model):
        ... snip ...
        book = models.ForeignKey(Book, null=True, blank=True)
    
        2
  •  0
  •   Henrik    9 年前

    好的,我解决了这个问题。

    我忘记在 ReadBySerializer PrimaryKeyRelatedField :

    book = serializers.PrimaryKeyRelatedField(source='book.id')
    

    事实上,自从 PrimaryKeyRelated字段 如果未指定任何内容,则为默认值。