从另一个表导入列

时间:2018-06-24 05:05:22

标签: django django-rest-framework

我使用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时,评论什么都没有显示。

enter image description here

我想显示所有与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)

当我连接到服务器时,

enter image description here

它仅显示相关评论的article_no。

但是我也想显示内容和日期。

1 个答案:

答案 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元组