DRF从查询集中排除

时间:2018-04-24 10:52:51

标签: python django django-rest-framework

我试图从另一个模型的外键中排除一个模型的ID。 所以我有一个用户模型,ManyToMany通过投票模型。现在我在我的ModelViewSet中尝试了多次.filter和.exclude并没有任何工作。 (当然我做得很糟糕。)从User.vote我得到了投票用户的ID,我希望它们被排除在to_user之外,因此登录的用户不能对同一个人投票两次,并且他自己。

class User(AbstractUser):
... some code.

    vote = models.ManyToManyField('self', through=Vote,
                                           symmetrical=False,
                                           related_name='related_to+')

class Vote(models.Model):

from_user = models.ForeignKey(User, related_name='from_user', on_delete=models.CASCADE)
to_user = models.ForeignKey(User, related_name='to_user', on_delete=models.CASCADE)
status = models.IntegerField(choices=VOTE_STATUSES)

和序列化器:

class UserVoteSerializer(serializers.ModelSerializer):
    from_user = serializers.PrimaryKeyRelatedField(read_only=True, default=CurrentUserDefault())

    class Meta:
        model = UserVote
        fields = ('from_user', 'to_user', 'status')

2 个答案:

答案 0 :(得分:0)

在您的视图中添加此内容 vote_from_user_ids = Vote.objects.values('from_user__id') 现在通过使用排除来自User的投票对象 users = User.objects.exclude(id__in = vote_from_user_ids)

现在投票模型的用户被排除在用户模型之外

答案 1 :(得分:0)

views.py

中试试这个
from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    serializer_class = UserVoteSerializer

    def get_queryset(self):
        return User.objects.exclude(id__in=Vote.objects.values_list('from_user__pk', flat=True).order_by('from_user__pk')))

它排除了在投票模型的from_user字段中存在ID的所有用户,即已经投票的用户,并返回尚未投票的用户。