API视图,如何通过已登录的用户过滤对象

时间:2019-03-23 17:45:20

标签: python django api

我有API视图,该视图显示通过id过滤的对象,并且一切正常,但是我无法更改此视图以按已登录的用户过滤,模型具有与User相关的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)

但是没有任何效果, 我知道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}'

1 个答案:

答案 0 :(得分:1)

这应该为您生成产品列表。关键区别在于many=True中的ProductSerializer

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)
相关问题