Как добавить разрешения для модели, чтобы любой пользователь мог добавить новый экземпляр, но только зарегистрированный пользователь может добавить определенный атрибут?
Джанго models.py
:
class Ingredient(models.Model):
name = models.CharField(max_length=100, unique=True)
recipes = models.ManyToManyField(Recipe, related_name='ingredients', blank=True)
DRF views.py
:
class IngredientViewSet(viewsets.ModelViewSet):
queryset = Ingredient.objects.all()
serializer_class = IngredientSerializer
permission_classes = (IsUserForRecipeOrBasicAddReadOnly,)
DRF permissions.py
:
class IsUserForRecipeOrBasicAddReadOnly(permissions.BasePermission):
"""
Custom permission to only allow logged in users to add an ingredient AND associate its recipe(s).
"""
message = 'You must be logged in to add an Ingredient to a Recipe.'
# using this method so I can access the model obj itself
def has_object_permission(self, request, view, obj):
# Read permissions are allowed to any request,
if request.method in permissions.SAFE_METHODS:
return True
# Check if we are creating, and if the recipes are included, and if they are not a user. If so, return False
if request.method == 'POST' and obj.recipes.all().count() > 0 and request.user.is_anonymous:
return False
else:
return True
Я вижу соответствующие вызовы / распечатки в пользовательский класс разрешений, но я все еще могу сделать запрос POST со списком рецептов id
, и он не выдаст сообщение об ошибке.
Примечания -
- Я получаю два запроса POST, оба с одинаковыми инструкциями information / print, а затем треть к GET (после добавления он показывает вновь созданный экземпляр - это правильное поведение, но я не знаю, почему проходят два поста)