这些是我模型的简化版本(用户模型只是一个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
}, ...
]
但是我想添加一个注释字段,该注释字段将注释的所有属性显示到响应中,因此基本上第二个查询集中的所有内容(称为注释)都完全不确定,我不确定该怎么做。 (由于要尽量减少对数据库的调用,所以我以这种方式检索注释)。我是否需要为评论创建一个新视图,创建自己的序列化程序,然后以某种方式将它们合并到convo的序列化程序中?
答案 0 :(得分:1)
建立模型的方式是,您可以使用convo_object.comments_set.all()
通过Django的ORM访问每个Convo
的注释,因此您可以设置ConvoSerializer
来访问它的注释实例的评论,像这样:
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
:
class CommentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Comments
fields = ('id', 'name', 'content')
答案 1 :(得分:0)
没有数据出现,因为我的序列化程序正在使用默认数据库,不知道为什么,但是前进了一步
编辑:
Django: Database used for prefetch_related is not the same that the parent query为我提供了正确的答案,我能够使用此方法选择数据库,因为出于某种原因内部查询使用默认的数据库