Хотите отправить дополнительные данные из BasePermission в Queryset в ModelVIewSet DRF

Вот моя модель продавца, которая имеет User как OneToOneField

#models.py
.
. 
class CompanyProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user")
    company = models.CharField(max_length=255)
    pincode = models.IntegerField()
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    address = models.TextField()
    profileActive = models.BooleanField(default=False)
.
.

Модель покупки

#models.py

class PurchaseOrder(models.Model):
    company = models.ForeignKey(CompanyProfile, on_delete=models.CASCADE)
    message = models.TextField(blank=True, null=True)
    expectedDelivery = models.DateField(blank=True, null=True)
    isCancel = models.BooleanField(default=False))
    updated_at = models.DateTimeField(auto_now=True)

# Пользовательские классы_разрешений

class SellerCompanyActive(BasePermission):
    message = 'Only Seller with activated company account is allowed'
    def has_permission(self, request, view):
        user = AuthUser.objects.get(id=request.user.id)
        if user.is_seller:
            try:
                company = CompanyProfile.objects.get(user=user)
                if company.profileActive:
                    return True
                else:
                    self.message = "Company profile is not active"
            except CompanyProfile.DoesNotExist:
                self.message = "Company not found first create company"
        return False

В ModelViewSet

#views.py

class SellerPurchaseOrder(viewsets.ModelViewSet):
    queryset = PurchaseOrder.objects.all()
    serializer_class = PurchaseOrderSerializer
    authorization_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated, SellerCompanyActive]
    
    def get_queryset(self):
        user = self.request.user
        company = CompanyProfile.objects.get(user=user)
        return self.queryset.filter(company=company)

Здесь мне всегда приходилось пользоваться этим

user = self.request.user
company = CompanyProfile.objects.get(user=user)

Поскольку есть много других представлений, есть ли другой способ отправить данные из моих пользовательских классов разрешений, например, из SellerCompanyActive в прямой SellerPurchaseOrder->get_queryset

Вы можете установить атрибут сообщения как dict, примерно так:

class SellerCompanyActive(BasePermission):
    message = {'error': 'Only Seller with activated company account is allowed'}
    def has_permission(self, request, view):
        ...

вы можете добавить больше полей в словарь, чтобы отправить больше данных

Вернуться на верх