DjangoRestFramework如何在视图集中获取用户

rya*_*yan 3 python django django-models django-views django-rest-framework

我试图建立一个朋友供稿,其中列出了我目前与之成为朋友的所有“节拍”对象。如何在我的视图集中访问用户以返回正确的对象?

楷模:

class Beat(models.Model):
    created_at = models.DateTimeField( default=datetime.now)
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)
    likes = models.IntegerField(default=0)
    artist = models.ForeignKey(UserProfile, null=True, blank=True)
    audio = models.FileField(upload_to="media_files/audio/",null=True, blank=True)
    beat_cover = models.ImageField(upload_to="media_files/img/",null=True, blank=True);
    admin_name = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        ordering = ['-created_at']

     def __unicode__(self):
        return unicode(self.admin_name)



class UserProfile(models.Model):
    user = models.OneToOneField(User, blank=True, null=True)
    admin_name = models.CharField(default="beat",max_length=255,blank=True, null=True)
    profile_pic = models.ImageField(upload_to="media_files/users/")

    def __unicode__(self):
        return unicode(self.admin_name)
Run Code Online (Sandbox Code Playgroud)

序列化器:

class AllBeatStreamSerializer(serializers.ModelSerializer):

    class Meta:
        model = Beat
        fields = ('created_at', 'title', 'audio', 'artist' )
        depth = 1
Run Code Online (Sandbox Code Playgroud)

视图集:

class FriendsBeatStreamViewSet(viewsets.ModelViewSet):
    user = self.request.user    
    my_battles = Battle.objects.filter(challenging_beat__artist=user)   
    obj = {}
    my_beats = Beat.objects.filter(artist=user)
    related_users = Relationship.objects.filter(from_user=user).values_list('to_user', flat=True).distinct()
    stream = Beat.objects.filter(artist__in=related_users)
    stream = list(my_beats) + list(stream) + list(my_battles)
    queryset = stream

    serializer_class = AllBeatStreamSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
Run Code Online (Sandbox Code Playgroud)

Fer*_*edo 6

您问题的直接答案很简单:替代get_queryset而不是将其定义queryset为属性,您将可以通过访问当前用户self.request.user

但是您的代码示例更加复杂。1)您不能将Battle对象与Beat对象混合。2)您的序列化器是Beat序列化器,因此您queryset必须是Beat实例。

但是,您可以将Beat使用过滤器的多种来源与orSQL中的原因混合使用,因此可以得到的所有优势my_beats OR related_to_me。Django有一个Q对象,可以进行复杂的查找。因此,您可以Q使用OR运算符连接两个对象|。每个Q都有代表Beat源的过滤器,例如my beatsbeats related to me

您的代码将如下所示:

from django.db.models import Q

class FriendsBeatStreamViewSet(viewsets.ModelViewSet):
    serializer_class = AllBeatStreamSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def get_queryset(self):
        user = self.request.user

        my_beats = Q(artist=user)

        related_users = Relationship.objects \
            .filter(from_user=user).values_list('to_user', flat=True).distinct()
        stream = Q(artist__in=related_users)

        return Beat.objects.filter(my_beats | stream)
Run Code Online (Sandbox Code Playgroud)