Python API视图,如何按已登录用户筛选对象

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

我有一个API视图,显示按id过滤的对象,一切正常,但我不能将此视图更改为按已登录用户过滤,模型具有与用户相关的ForeignKey,我希望此视图仅显示与已登录用户相关的对象

这是我的工作id视图:

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正在获取产品。感谢您的建议,我将使用她