В django разрешениях уровня объекта restframework должен ли владелец модели быть моделью "Пользователь" или это может быть любая другая модель? - PullRequest
0 голосов
/ 21 апреля 2020

Я работаю над проектом с django restframework. У меня вопрос: должен ли владелец модели быть моделью "Пользователь" или это может быть любая другая модель?

В моем случае, у пользователя есть разные магазины, и каждый магазин продает разные товары. Я хочу, чтобы каждый магазин был владельцем своего продукта, а не пользователем.

Мой файл permissions.py:

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner.
        return obj.owner == request.user

В приведенном выше коде как установить request.user в что-то другое? Насколько я понимаю, использование == сравнивает свойства, а не установку obj.owner с request.user

PS. в моей модели я установил поле, которым я хочу быть владельцем:

class StoreItem(models.Model):
    ...
    owner = models.ForeignKey(Store, to_field='id', null=True, on_delete=models.SET_NULL)
    ...

, в моем сериализаторе я также установил владельца:

class StoreItemSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='store.owner')

    class Meta:
        model = OrderItem
        fields = [
            ...,
            'owner',
        ]

1 Ответ

0 голосов
/ 21 апреля 2020

Ну, что obj представляет в IsOwnerOrReadOnly, элементе магазина? Если это так, сравнивать его с пользователем не имеет смысла. Почему бы вам сначала не переименовать поле owner в вашей модели StoreItem для хранения, поскольку это то, что оно представляет, Store.

Тогда я бы проверил, принадлежит ли текущий store item в магазин.

class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True

        # Write permissions are only allowed to the owner.
        return obj.store.id == get_object_or_404(Store, id=obj.store.id).id
...