仅当您已通过身份验证且仅使用django rest框架向您的用户发布数据

仅当您已通过身份验证且仅使用django rest框架向您的用户发布数据,django,django-rest-framework,Django,Django Rest Framework,我是Django的新手,如果这看起来很愚蠢,我很抱歉。 我只想在用户经过身份验证的情况下将项目添加到数据库中 以下是模型: class SaleItems(models.Model): product_name = models.CharField(max_length=50) price = models.IntegerField() product_type = models.CharField(max_length=25) description = mod

我是Django的新手,如果这看起来很愚蠢,我很抱歉。 我只想在用户经过身份验证的情况下将项目添加到数据库中

以下是模型:

class SaleItems(models.Model):
    product_name = models.CharField(max_length=50)
    price = models.IntegerField()
    product_type = models.CharField(max_length=25)
    description = models.CharField(max_length=250 ,default='', blank=True)
    brand = models.CharField(max_length=25, null=True,blank=True)
    image_path = models.ImageField(upload_to='images/product_image')
    date_added = models.DateField(auto_now_add=True)
    in_stock = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.product_name}, price={self.price}"


class SaleHistory(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    product = models.ForeignKey(SaleItems, on_delete=models.RESTRICT, default=None)
    date_bought = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.date_bought}, {self.product}, {self.user}' 
序列化程序:

class SaleItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = SaleItems
        fields = '__all__'


class SaleHistorySerializier(serializers.ModelSerializer):
    class Meta:
        model = SaleHistory
        fields = '__all__'

网址:

最后是API

class SaleItemViewSet(viewsets.ModelViewSet):
    queryset = SaleItems.objects.all()
    permission_classes = [permissions.AllowAny]
    serializer_class = SaleItemSerializer


class SaleHistoryViewSet(viewsets.ModelViewSet):
    # queryset = SaleHistory.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = SaleHistorySerializier

    def get_queryset(self):
        user = self.request.user
        return SaleHistory.objects.filter(user = user)
所以问题是,当我发布到“api/salehistory”时,我能够向任何用户添加内容,而不仅仅是作为经过身份验证的用户。 (使用knox authtoken进行身份验证)

比如说,我被认证为user1,并且我有我的auth令牌。现在,我可以使用该令牌为任何不希望的用户向SaleHistory模型添加项目

我怎样才能解决这个问题


再一次为粗俗的描述感到抱歉。第一次在这里提问。

首先,使用


你为什么使用viewet而不是apiview?我不是专家,但我认为你可以让
执行像
get\u queryset
这样的创建
功能,并在该功能中确保创建的销售历史属于经过身份验证的用户。老实说,我不知道。但是我所理解的ViewSet允许更简单的url配置,或者类似的东西。我应该使用apiview吗?。
class SaleItemViewSet(viewsets.ModelViewSet):
    queryset = SaleItems.objects.all()
    permission_classes = [permissions.AllowAny]
    serializer_class = SaleItemSerializer


class SaleHistoryViewSet(viewsets.ModelViewSet):
    # queryset = SaleHistory.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = SaleHistorySerializier

    def get_queryset(self):
        user = self.request.user
        return SaleHistory.objects.filter(user = user)
class SaleHistorySerializier(serializers.ModelSerializer):
    class Meta:
        model = SaleHistory
        fields = '__all__'
        read_only_fields = ("user",)
class SaleHistoryViewSet(viewsets.ModelViewSet):
    # queryset = SaleHistory.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = SaleHistorySerializier

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

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)