这是我的(简化) models.py:
class MyList(models.Model):
title = models.CharField(max_length=40)
participants = models.ManyToManyField(
settings.AUTH_USER_MODEL,
through='ParticipantsInList',
related_name='participants',
)
class ParticipantsInList(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='user')
list_parent = models.ForeignKey(MyList, related_name='list_parent')
moderator = models.BooleanField(default=False)
和我的 serializers.py:
class ParticipantsInListSerializer(serializers.ModelSerializer):
class Meta:
model = ParticipantsInList
exclude = ('id',)
和我的 views.py:
class ParticipantsInListView(generics.ListCreateAPIView):
serializer_class = ParticipantsInListSerializer
def get_queryset(self):
list_id = self.kwargs['list_pk']
# This works:
# return ParticipantsInList.objects.filter(list_parent=list_id)
# While this doesn't:
return MyList.objects.get(pk=list_id).participants.all()
我无法弄清楚为什么在views.py中使用它: ParticipantsInList.objects.filter(list_id = list_id) 可以使用 List.objects.get(pk = list_id).participants.all() 引发异常' RelatedManager'对象没有属性' pk'。
我想使用后者,因为我觉得它更好看,也因为我相信它应该有效..
答案 0 :(得分:5)
问题在于我试图序列化直通模型,如果查询是在直通模型本身上运行的话(在使用过滤器时就是这种情况)。但是当在MyList中使用ManyToManyField进行查询时,只返回实际的用户对象。因此,在引用ManyToManyField时,解决方案是使用可以序列化用户对象的序列化程序,而不是通过模型。
在shell中运行查询可以证明这一点:
> ParticipantsInList.objects.filter(list_parent=1)
[<ParticipantsInList: ParticipantsInList object>, <ParticipantsInList: ParticipantsInList object>]
运行其他查询时返回:
> MyList.objects.get(pk=1).participants.all()
[<MyUser: user1>, <MyUser: user2>]