Вот мой сериализатор модели:
class FoodImagesSerializerGet(serializers.ModelSerializer):
current_user = serializers.HiddenField(default=serializers.CurrentUserDefault())
food = serializers.SlugRelatedField(
many=False, read_only=False,slug_field='id', queryset=Food.objects.filter(users=current_user)
)
Модель:
class FoodImages(models.Model):
food = models.ForeignKey(Food, related_name='food_images', related_query_name='food_image', on_delete=models.CASCADE, null=True)
class Food(models.Model):
users = models.ManyToManyField(
Profile,
related_name='userfoods',
related_query_name='userfood',
)
Я хочу ограничить сериализатор пользователями, чтобы только пользователи еды могли публиковать изображения. . Я хочу сделать это только с помощью SlugRelatedField





Вы можете переопределить SlugRelatedField следующим образом:
class CustomSlugRelatedField(SlugRelatedField):
def get_queryset(self):
return self.queryset.filter(users=self.context['request'].user)
class FoodImagesSerializerGet(serializers.ModelSerializer):
food = CustomSlugRelatedField(
many=False, read_only=False,slug_field='id', queryset=Food.objects.all()
)
Наконец, вам нужно передать request через контекст в сериализаторе. Об этом позаботятся GenericViews и ModelViewSets автоматически, для представления на основе функций вы можете попробовать следующее:
serializer = FoodImagesSerializerGet(Food.objects.first(), context = {'request': request})
Насколько мне известно, часть представления является стандартной реализацией, то же самое реализуется и в универсальных представлениях, предоставляемых DRF. Но может быть несколько вариантов реализации переопределения в сериализаторе. В любом случае вам нужен пользовательский объект в сериализаторе, чтобы он работал. Контекст — это стандартный способ передать его из представления сериализатору.
Я использую ModelViewSet и не могу передать такой запрос
об этом уже позаботился ModelViewSet. Вам не придется,
Поскольку сериализатор является атрибутом класса, я не могу передать запрос ir\t
Я имел в виду, что вам не нужно ничего делать или вносить какие-либо изменения в ViewSet. Потому что внутренне viewset отправляет объект запроса сериализатору.
TypeError: поле «id» ожидало число, но получило HiddenField (по умолчанию = CurrentUserDefault ()).
Давайте продолжим обсуждение в чате.
это атрибут класса, он не может получить доступ к контексту запроса во время выполнения. Вы должны получить к нему доступ с помощью метода init
class FoodImagesSerializerGet(serializers.ModelSerializer):
current_user = serializers.HiddenField(default=serializers.CurrentUserDefault())
food = serializers.SlugRelatedField(
many=False, read_only=False,slug_field='id', queryset=Food.objects.all()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['food'].queryset = Food.objects.filter(users=self.context['request'].user)
TypeError: поле «id» ожидало число, но получило HiddenField (по умолчанию = CurrentUserDefault ()).
@Leviathan, ах, удалите старые qs, вы фактически предоставляете их при инициализации
AttributeError: объект FoodImagesSerializerGet не имеет родительского атрибута
f* я тоже забыл super LOL
Есть ли другой более чистый метод? Я имею в виду, что предпочитаю не трогать взгляды