【问题标题】:Filter current user products using queryset in DRF returns []在 DRF 返回 [] 中使用查询集过滤当前用户产品
【发布时间】:2022-11-30 23:52:34
【问题描述】:

我正在尝试过滤与用户链接的产品列表。我只想显示当前用户的产品而不是列出所有产品。

我试过这个

class ProductCreateList(generics.ListCreateAPIView):
    serializer_class = ProductSerializer

    def get_queryset(self):
        user = self.request.user
        return Product.objects.filter(user=user.id)

序列化程序.py

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ['id', 'user', 'name', 'imgUrl', 'selling_price', 'actual_price', 'quantity', 'get_profit']

模型.py

class Product(models.Model):
    user = models.ForeignKey('accounts.Account', on_delete=models.CASCADE, default=1)
    name = models.CharField(max_length=100, null=True, blank=True)
    imgUrl = models.TextField(default='')
    selling_price = models.FloatField(null=True, blank=True)
    actual_price = models.FloatField(null=True, blank=True)
    quantity = models.IntegerField()

当我尝试执行端点时,我得到了 [] 对象。我的错误是什么?

【问题讨论】:

    标签: django django-rest-framework django-views


    【解决方案1】:

    有一些错误,主要是在你看来。我做了以下事情:

    模型.py

    from django.db import models
    from django.contrib.auth import get_user_model
    
    class Product(models.Model):
        user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, default=1)
        name = models.CharField(max_length=100, null=True, blank=True)
        imgUrl = models.TextField(default='')
        selling_price = models.FloatField(null=True, blank=True)
        actual_price = models.FloatField(null=True, blank=True)
        quantity = models.IntegerField()
    
        class Meta:
            db_table = 'product'
    

    serializers.py:删除“get_profit”字段或实施serializermethodfield

    from rest_framework import serializers
    from core.models import Product
    
    class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            fields = ['id', 'user', 'name', 'imgUrl', 'selling_price', 'actual_price', 'quantity']
    

    views.py:按用户过滤,保证用户已通过身份验证并具有授权权限身份验证类权限类.使用过滤器查询集钩子,按用户过滤您的查询集。

    from rest_framework.authentication import SessionAuthentication, BasicAuthentication
    from rest_framework.permissions import IsAuthenticated
    from rest_framework import generics
    from core.api.serializers import ProductSerializer
    from core.models import Product
    
    class ProductCreateList(generics.ListCreateAPIView):
        authentication_classes = [SessionAuthentication, BasicAuthentication]  
        permission_classes = [IsAuthenticated]
    
        serializer_class = ProductSerializer
        queryset = Product.objects.all()
    
        def filter_queryset(self, queryset):
            queryset = queryset.filter(user=self.request.user)
            return super().filter_queryset(queryset)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2021-01-10
      • 2018-12-01
      相关资源
      最近更新 更多