Python API视图,如何按已登录用户筛选对象
我有一个API视图,显示按id过滤的对象,一切正常,但我不能将此视图更改为按已登录用户过滤,模型具有与用户相关的ForeignKey,我希望此视图仅显示与已登录用户相关的对象 这是我的工作id视图:Python API视图,如何按已登录用户筛选对象,python,django,api,Python,Django,Api,我有一个API视图,显示按id过滤的对象,一切正常,但我不能将此视图更改为按已登录用户过滤,模型具有与用户相关的ForeignKey,我希望此视图仅显示与已登录用户相关的对象 这是我的工作id视图: class CreateComment(APIView): def get_object(self, id): try: return Product.objects.get(id=id) except Product.DoesNotExist: r
class CreateComment(APIView):
def get_object(self, id):
try:
return Product.objects.get(id=id)
except Product.DoesNotExist:
raise Http404
def get(self,request, id):
product = self.get_object(id)
serializer = ProductSerializer(product)
return Response(serializer.data)
def post(self, request, id):
serializer = CommentSerializer(data=request.data)
if serializer.is_valid():
serializer.save(nick=request.user, product=self.get_object(id))
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我试着这样做:
def get_object(self):
try:
return Product.objects.filter(user=request.user)
except Product.DoesNotExist:
raise Http404
def get(self):
product = self.get_object()
serializer = ProductSerializer(product)
return Response(serializer.data)
def get(self, request):
product = Product.objects.filter(user=request.user)
serializer = ProductSerializer(product)
return Response(serializer.data)
像这样的:
def get_object(self):
try:
return Product.objects.filter(user=request.user)
except Product.DoesNotExist:
raise Http404
def get(self):
product = self.get_object()
serializer = ProductSerializer(product)
return Response(serializer.data)
def get(self, request):
product = Product.objects.filter(user=request.user)
serializer = ProductSerializer(product)
return Response(serializer.data)
但什么都不管用,
我知道get_queryset,但这是针对一般视图的,或者也可能是针对自定义视图的,但我不知道如何在我的视图中使用它
#Models.py
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, unique=True,)
class Meta:
ordering = ('name',)
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('product_list', args=[self.slug])
lass Product(models.Model):
STATUS_CHOICES = (('available', 'dostępny'),
('unavailable', 'niedostępny'))
category = models.ForeignKey(Category, on_delete=models.CASCADE, default=None, related_name='products')
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100, unique=True,)
description = models.TextField()
photo = models.ImageField(upload_to='photos/', default=None)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.CharField(max_length=11, choices=STATUS_CHOICES,
default='unavailable')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
class Meta:
ordering = ('name',)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('product_detail', args=[self.id, self.slug])
class Comment(models.Model):
STATUS_CHOICES = (('1/5', '1'),
('2/5', '2'),
('3/5', '3'),
('4/5', '4'),
('5/5', '5'),)
nick = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
rate = models.CharField(max_length=3, choices=STATUS_CHOICES, default=None)
content = models.TextField(max_length=250)
product = models.ForeignKey(Product, related_name='comments',
on_delete=models.CASCADE, default=None)
published = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ('published',)
def __str__(self):
return f'Komentarz wstawiony przez {self.nick} do produktu {self.product}'
这将为您生成一个产品列表。关键区别在于
ProductSerializer
中的many=True
class ProductView(APIView):
def get_queryset(self):
return Product.objects.filter(user=self.request.user)
def get(self,request, id):
products = self.get_queryset()
serializer = ProductSerializer(products, many=True)
return Response(serializer.data)
你应该考虑把你的API端点分开。您使用的是相同的路径,但具有不同的序列化程序(产品和注释)。这通常是个糟糕的设计。CreateComment的GET路径是否返回产品列表或单个产品?现在它返回单个产品,但我希望返回与已登录用户相关的产品列表。请添加您的模型。好的,模型是AddedHanks,它可以工作,但没有id参数,因为id在“GET(self,request,id)”中我已经错过了位置参数“ID”。我真的认为你应该考虑重新设计API来拆分帖子,让流变成完全不同的API端点。你是说POST和GET应该是分开的视图吗?是的,因为它们处理的是不同类型的数据。该帖子正在创建一条评论,而GET正在获取产品。感谢您的建议,我将使用她