Невозможно преобразовать ключевое слово '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
)
и затем использовать его для фильтрации ExampleModelTag
s:
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
)