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)
您问题的直接答案很简单:替代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 beats或beats 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)