Не удается разрешить ключевое слово «автор» в поле

#django

Вопрос:

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

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

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

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
        )
 

Комментарии:

1. Можете ли вы поделиться своим ModelView (или другим APIView , где вы его используете ExampleModelSerializer )?

2. пожалуйста, обновите свой views.py код

3. Проверьте обновление, пожалуйста

Ответ №1:

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

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

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

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

а затем используйте его для фильтрации ExampleModelTag s:

 class ExampleModelTagViewSet(viewsets.ModelViewSet):
    # ⋮
    filter_backends = [ExampleModelAuthorBackend] 

Комментарии:

1. Точно. Я не думал, что проблема может возникнуть из-за этого. Иногда вы совершаете ошибки из-за слишком большой автоматизации (копирование и вставка), не проверяя ее. Я воспользуюсь вторым вариантом. Большое спасибо!

Ответ №2:

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

Комментарии:

1. Это не будет работать для ExampleModelViewSet , так как у an ExampleModel нет examplemodel внешнего ключа. Таким образом , вы исправили его для ExampleModelTagViewSet своего, но теперь он сломан для ExampleModelViewSet своего .