2

我試圖做一個朋友飼料,列出我目前的朋友與所有「Beat」對象。我如何訪問我的視圖中的用戶來返回正確的對象?DjangoRestFramework如何讓用戶在視圖中

模型:

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) 

串行:

class AllBeatStreamSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Beat 
     fields = ('created_at', 'title', 'audio', 'artist') 
     depth = 1 

視圖集:

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,) 

回答

2

直接回答您的問題很簡單:覆蓋get_queryset而不是將queryset定義爲屬性,並且您將能夠通過self.request.user訪問當前用戶。

但您的代碼示例更復雜。 1)不能將Battle對象與Beat對象混合使用。 2)你的串行器是一個Beat串行器,所以你的queryset必須是Beat實例。

但是,您可以在SQL中使用具有or原因的篩選器將Beat的許多源混合,因此您可以獲得所有節拍my_beats OR related_to_me。 Django有一個Q object,可以進行復雜的查找。因此,您可以使用OR運營商|加入兩個Q對象。每個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) 
0

你應該重寫在串行器queryset屬性(在那裏該邏輯所屬)所示:

class AllBeatStreamSerializer(serializers.ModelSerializer): 
    # ... 

    def __init__(self, *args, **kwargs): 
     user = kwargs['context']['request'].user 

     super(AllBeatStreamSerializer, self).__init__(*args, **kwargs) 
     self.fields['parent'].queryset = self.get_request(user) 

    def get_request(self, 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 

     return queryset 
相關問題