Запретить пользователю создавать экземпляр для других пользователей

У меня есть 4 модели, каждая из которых связана друг с другом с помощью ForeignKey.

class User(models.Model):
    name = models.CharField()

class Business(models.Model):
    name = models.CharField() //business name
    created_by = models.ForeignKey(User,related_name=businesses,on_del=models.CASCADE)

class ProdCategory(models.Model):
    business = models.ForeignKey(Business,related_name=categories,on_del=models.CASCADE)
    name = models.CharField()

class Product(models.Model):
    category = models.ForeignKey(ProdCategory,related_name=products,on_del=models.CASCADE)
    name = models.ForeignKey()
    price = models.DecimalField()

Теперь, если я пытаюсь получить все продукты текущего аутентифицированного пользователя, я получаю корректный список продуктов (которые исходят от того же User>Business>ProdCategory>Product)

Но если я пытаюсь создать продукт с аутентифицированным пользователем, я могу создать продукт, указав id ProdCategory (уже созданный разными пользователями) (Пользователь Business>ProdCategory) != self.request.user

Короче говоря, я могу создать продукт для других пользователей. Но это не то, что я хочу. Я хочу запретить текущему пользователю создавать продукты, если предоставленный идентификатор ProdCategory принадлежит другому пользователю. Это должно возвращать ошибку. Пользователь должен предоставить id ProdCategory, который был создан тем же пользователем.

Классы сериализатора определяются со всеми полями с помощью ModelSerializer.

.

Вот вид для создания и перечисления продуктов:

class ProductListCreateView(generics.ListCreateAPIView):
    serializer_class = ProductListCreateSerializer

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

Буду благодарен за любую помощь.

Я не видел вашей стороны create product. Поэтому я просто пишу логику.

prodCategory= ProdCategory.objects.get(id=1)
if prodCategory.business.created_by == request.user:
     #let user to create the product
     Product.objects.create()
else:
    return False

Надеюсь, вы понимаете логику

В основном, я хотел бы предотвратить перемещение продукта в ProdCategory, который не принадлежит пользователю.

Я только что нашел решение. поэтому я добавляю это сюда на случай, если кто-нибудь еще столкнется с той же проблемой.

чтобы предотвратить пользователя, я добавил валидацию для категории в сериализаторе Product. Переопределение метода create не является необходимым.

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'
    
    def validate_category(self, value):
        category_id = value.id
        category = ProdCategory.objects.get(id=category_id)
        user = self.context['request'].user
        if category.business.created_by != user:
            raise serializers.ValidationError("You do not have permission")
        return value
Вернуться на верх