字段名称 '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?
我有以下博客序列化器 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?