我使用Django Restframework制作了API。
[models.py]
from django.db import models
class Article(models.Model):
article_no = models.AutoField(primary_key=True)
content = models.CharField(max_length=500, null=False)
password = models.CharField(max_length=20, null=False, default='1234')
date = models.DateTimeField(auto_now_add=True)
class Comment(models.Model):
article_no = models.ForeignKey('Article', on_delete=models.CASCADE)
content = models.CharField(max_length=50, null=False, default='')
password = models.CharField(max_length=20, null=False, default='1234')
date = models.DateTimeField(auto_now_add=True)
[views.py]
class ArticleDetail(APIView):
def get(self, request, article_no, format=None):
try:
article = models.Article.objects.get(article_no=article_no)
serializer = serializers.ArticleDetailSerializer(article)
return Response(status=status.HTTP_200_OK, data=serializer.data)
except models.Article.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
[urls.py]
urlpatterns = [
path('article/<int:article_no>', views.ArticleDetail.as_view(), name='article_detail'),
]
[serializers.py]
class ArticleDetailSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=True)
comment = CommentSerializer(many=True, read_only=True)
class Meta:
model = models.Article
fields = (
'article_no',
'content',
'password',
'date',
'comment',
)
在serializers.py
中,我定义了comment = CommentSerializer(many=True, read_only=True)
并将其添加到字段中。
要进行测试,我为article_no = 1添加评论
但是当我连接到/ article / 1时,评论什么都没有显示。
我想显示所有与article_no相关的评论。
我该如何解决?
谢谢。
固定来源在这里。
[serializers.py]
class ArticleDetailSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True, required=True)
class Meta:
model = models.Article
fields = (
'article_no',
'content',
'password',
'date',
'comments',
)
[models.py]
class Comment(models.Model):
article_no = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments')
content = models.CharField(max_length=50, null=False, default='')
password = models.CharField(max_length=20, null=False, default='1234')
date = models.DateTimeField(auto_now_add=True)
当我连接到服务器时,
它仅显示相关评论的article_no。
但是我也想显示内容和日期。
答案 0 :(得分:1)
根据https://docs.djangoproject.com/en/2.0/topics/db/queries/#backwards-related-objects上的Django文档,您可以通过调用article_instance.comment_set.all()
来访问对象列表,也可以在初始化时在模型上设置related_name
参数
article_no = models.ForeignKey('Article', on_delete=models.CASCADE, related_name="comments")
访问就像article_instance.comments.all() or filter() or exclude()
实际上有很多选项,这取决于用例,但是为了简单起见,在这种情况下,您可以将comment
变量更改为comment_set
,或者可以将related_name更改为comments
并在序列化程序中引用它。
需要对ArticleDetailSerializer进行更改...
comment = CommentSerializer(many=True, read_only=True)
到
comments = CommentSerializer(many=True, read_only=True)
您还没有创建CommentSerializer类,或者尚未将其发布到问题中。
示例CommentSerializer ......
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model=Comment
exclude=('article_no',)
我排除了article_no,并且由于django模型上分配了默认值,因此应处理其余字段。
Django中的相关对象管理器返回一个查询集,该查询集可以像其他任何查询集一样进行操作。因此,您将要考虑一篇文章是否可能有荒谬的评论并限制返回的数量。
您还可以使用SerializerMethodField
并更好地控制返回的查询集
comments = serializers.SerializerMethodField()
def get_comments(self, obj):
comments = obj.comments/comment_set.all()[:20] #return the first 20 comments
return CommentSerializer(comments/comment_set, many=True, read_only=True).data
现在将comments/comment_set
添加到课程Meta/fields
元组