字段名称 'field_name' 对模型模型无效

Field name 'field_name' is not valid for model Model

我有以下博客序列化器 post :

class TagSerializer(serializers.ModelSerializer):
    """Tag Serializer."""
    owner = serializers.ReadOnlyField(source='owner.username')
    posts = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Tag
        fields = ('id', 'name', 'owner', 'posts',)


class PostSerializer(serializers.ModelSerializer):
    """Post Serializer"""
    owner = serializers.ReadOnlyField(source='owner.username')
    comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Post
        fields = ('id', 'title', 'body', 'owner', 'comments', 'tags', )

及以下型号:

class Post(TimeStampedModel, models.Model):
    """Post model."""
    title = models.CharField(_('Title'), max_length=100, blank=False, null=False)
    body = models.TextField(_('Body'), blank=False)
    owner = models.ForeignKey(User, related_name='posts',
                              on_delete=models.CASCADE)

    class Meta:
        ordering = ['created']

    def __str__(self):
        """
        Returns a string representation of the blog post.
        """
        return f'{self.title} {self.owner}'


class Tag(models.Model):
    """Tags model."""
    name = models.CharField(max_length=100, blank=False, default='')
    owner = models.ForeignKey(User, related_name='tags_owner',
                              on_delete=models.CASCADE)
    posts = models.ManyToManyField('Post', related_name='tags_posts',
                                   blank=True)

    class Meta:
        verbose_name_plural = 'tags'

    def __str__(self):
        """
        Returns a string representation of the category post.
        """
        return f'{self.name}'

我想知道为什么会收到此错误:

何时获取博客列表 posts

最后是我的看法:

class PostList(generics.ListCreateAPIView):
    """Blog post lists"""
    queryset = Post.objects.all()
    serializer_class = serializers.PostSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

这是两段代码造成的

首先,您的标签型号:

class Tag(models.Model):
    [...]
    posts = models.ManyToManyField('Post', related_name='tags_posts',
                                   blank=True)

其次,您的 post 序列化程序:

class PostSerializer(serializers.ModelSerializer):
    [...]

    class Meta:
        model = Post
        fields = (... 'tags', )

您的 post 序列化程序需要一个名为 'tags.' 的字段 在 ManyToManyField 中,您将 related_name 设置为 'tags_posts.' 这两个不匹配,这是导致问题的原因.您必须将要序列化的字段更改为 tags_post,或者像这样更改 related_name:

class Tag(models.Model):
    [...]
    posts = models.ManyToManyField('Post', related_name='tags',
                                   blank=True)

另请参阅:What is related_name used for?