Невозможно преобразовать ключевое слово 'author' в поле

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

Ошибка: Cannot resolve keyword 'author' into field. Choices are: id, examplemodel, examplemodel_id, tag, timestamp

Я не могу понять, в чем проблема, я могу создать их так, чтобы алгоритм работал. Теги могут соединяться со своей родительской моделью. Но когда я пытаюсь сделать HTTP DELETE на ExampleModelTags, я получаю эту проблему. Где проблема, которую я не вижу?

Model.py

class ExampleModelTag(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    tag = models.CharField(max_length=35,null=True,blank=True)
    examplemodel = models.ForeignKey(ExampleModel, on_delete=models.CASCADE,null=True,blank=True, related_name='examplemodeltags')
    timestamp = models.DateTimeField(auto_now_add=True)


class ExampleModel(models.Model):

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE,null=True,related_name='examplemodels')
    examplemodel = models.CharField(unique=False,max_length=100,null=True,blank=True)
    timestamp = models.DateTimeField(unique=False,auto_now_add=True)

Serializer.py

class ExampleModelTagSerializer(serializers.ModelSerializer):

    class Meta:
        model = ExampleModelTag
        fields = ("id","examplemodel","tag","timestamp")

    def validate(self, attrs):
        attrs = super().validate(attrs)
        if attrs['examplemodel'].author.id != self.context['request'].user.pk:
            raise ValidationError('Unauthorized Request')
        return attrs


class ExampleModelSerializer(serializers.ModelSerializer): 
    examplemodeltags_set = ExampleModelTagSerializer(source='examplemodeltags',required=False,many=True)

    class Meta:
        model = ExampleModel
        fields = ("id","author","examplemodel","examplemodeltags_set","timestamp")

    def validate(self, attrs):
        attrs = super().validate(attrs)
        if attrs['author'].id != self.context['request'].user.pk:
            raise ValidationError('Unauthorized Request')
        return attrs

Views.py

class ExampleModelViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = ExampleModel.objects.all().order_by('-timestamp')
    serializer_class = ExampleModelSerializer
    filter_backends = [UserFilterBackend]

class ExampleModelTagViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    queryset = ExampleModelTag.objects.all()
    serializer_class = ExampleModelTagSerializer
    filter_backends = [UserFilterBackend]

Filters.py

class UserFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(
            author=request.user
        )

Вы не можете использовать UserFilterBackend на ExampleModelTagViewSet, поскольку ExampleModelTag не имеет поля author. Таким образом, вы должны переписать ExampleModelTagViewSet на:

class ExampleModelTagViewSet(viewsets.ModelViewSet):
    # ⋮
    filter_backends = []  # ← UserFilterBackend not applicable

Если вы хотите получить ExampleModelTag, для которых существует ExampleModel ссылка на эту ExampleModelTag запись, и в качестве author указан вошедший пользователь, вы можете указать это с помощью:

class ExampleModelAuthorBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(
            examplemodel__author=request.user
        )

и затем использовать его для фильтрации ExampleModelTags:

class ExampleModelTagViewSet(viewsets.ModelViewSet):
    # ⋮
    filter_backends = [ExampleModelAuthorBackend]
class UserFilterBackend(filters.BaseFilterBackend):
    
    def filter_queryset(self, request, queryset, view):
        return queryset.filter(
            examplemodel__author=request.user
        )
Вернуться на верх