我试图从另一个模型的外键中排除一个模型的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')
答案 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的所有用户,即已经投票的用户,并返回尚未投票的用户。