#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
, так как у anExampleModel
нетexamplemodel
внешнего ключа. Таким образом , вы исправили его дляExampleModelTagViewSet
своего, но теперь он сломан дляExampleModelViewSet
своего .