Python 如何使模型数据在另一个模型的响应中显示为字段

Python 如何使模型数据在另一个模型的响应中显示为字段,python,django-rest-framework,django-views,Python,Django Rest Framework,Django Views,这些是我的模型的简化版本。用户模型只是一个id和名称 class Convo(models.Model): owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='convo_owner') users = models.ManyToManyField(User, through='Convo_user') class Convo_user (models.Model): user

这些是我的模型的简化版本。用户模型只是一个id和名称

class Convo(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='convo_owner')
    users = models.ManyToManyField(User, through='Convo_user')

class Convo_user (models.Model):
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    convo = models.ForeignKey(Convo, on_delete=models.CASCADE)

class Comments(models.Model):
    name = models.CharField(max_length=255)
    content = models.TextField(max_length=1024)
    convo = models.ForeignKey(Convo, on_delete=models.CASCADE)
这是我的看法

class ConvoViewSet(viewsets.ModelViewSet):

serializer_class = serializers.ConvoSerializer

def get_queryset(self):
    return None

def list(self, request):
    curr_user = request.user.id

    # Collecting the list of conversations
    conversations = models.Conversation.object.filter(ConvoUser__user_id=request.user.id)
    #Getting list of conversation id's
    conv_ids = list(conversations.values_list('id', flat=True).order_by('id'))
    #Getting list of relevant comments
    comments = models.Comments.objects.filter(conversation_id__in=conv_ids)

    return Response(self.get_serializer(conversations, many=True).data)
和我当前的序列化程序

class ConvoSerializer(serializers.ModelSerializer):
"""A serializer for messaging objects"""
# access = AccessSerializer(many=True)

    # model = models.Comments
    # fields = ('id', 'name', 'content', 'convo_id')

class Meta:
    model = models.Convo
    fields = ('id', 'owner_id')
我目前得到的答复是

[
    {
        "id": 1,
        "owner_id": 32
    }, ...
]

但是我想添加一个comments字段,在响应中显示注释的所有属性,因此第二个queryset中的所有内容基本上都称为comments,我根本不知道如何进行。我以我的方式检索注释,因为我试图最小化对数据库的调用。我是否需要为注释创建一个新视图,创建自己的序列化程序,然后以某种方式将它们合并到COVA的序列化程序中?

按照您设置模型的方式,您可以使用Django的ORM访问每个COVA的注释,因此您可以设置COLASerializer以访问该实例的注释,如下所示:

class ConvoSerializer(serializers.ModelSerializer):
"""A serializer for messaging objects"""

    comments_set = CommentSerializer(many=True)

    class Meta:
       model = models.Convo
       fields = ('id', 'owner_id', 'comments_set')
然后定义您的CommentSerializer,如下所示:


没有数据出现,因为我的序列化程序正在使用默认数据库,不确定原因,但向前迈进了一步

编辑:


提供了正确的答案,我能够使用此方法选择数据库,因为出于某种原因,内部查询使用默认的DB

我以前见过set.all方法的用法,但我不确定如何实际使用它来检索viewset中的信息,以及我已经有的信息。按照我的结构,只要将CONVERA对象传递给序列化程序,它就会在每个CONVERA的所有comments对象中使用CommentSerializer。只要更新对话序列化程序并添加注释序列化程序,就会添加一个带有空数组的字段注释集,有什么我遗漏的吗?即使是有评论的对话?是的,所有对话都是空的,尽管可能这需要一个不同的帖子,因为最初的问题在技术上已经解决了?
class CommentSerializer(serializers.ModelSerializer):

    class Meta:
       model = models.Comments
       fields = ('id', 'name', 'content')