仅当您已通过身份验证且仅使用django rest框架向您的用户发布数据
我是Django的新手,如果这看起来很愚蠢,我很抱歉。 我只想在用户经过身份验证的情况下将项目添加到数据库中 以下是模型:仅当您已通过身份验证且仅使用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
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)