gpt4 book ai didi

python - DjangoRestFramework 如何在 View 集中获取用户

转载 作者:太空宇宙 更新时间:2023-11-03 13:38:58 24 4
gpt4 key购买 nike

我正在尝试制作一个 friend 提要,其中列出了我目前与之成为 friend 的所有“Beat”对象。我如何访问我的 View 集中的用户以返回正确的对象?

模型:

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

View 集:

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

最佳答案

您问题的直接答案很简单:Override get_queryset而不是定义 queryset作为属性,您将能够在 self.request.user 上访问当前用户.

但是您的代码示例更复杂。 1)你不能混合Battle对象 Beat对象。 2) 你的序列化器是 Beat序列化程序,所以你的 queryset必须是 Beat实例。

但您可以混合使用 Beat 的多种来源使用带有 or 的过滤器SQL 中的原因,所以你得到所有 my_beats OR related_to_me 的节拍. Django 有一个 Q object允许复杂的查找。所以你可以加入两个Q使用 OR 的对象运算符(operator) | .每个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)

关于python - DjangoRestFramework 如何在 View 集中获取用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com