Форум сайта python.su
Здравствуйте!
Не могу написать сериализатор для модели, который будет подставлять в значение поля id текущего пользователя в момент создания записи, в остальное же время возвращающий только id и ФИО пользователя.
Модель:
from django.models import models from django.conf import settings class NewsItem(models.Model): author = models.ForeignKey(settings.AUTH_USER_MODEL)
class NewsReadSerializer(serializers.ModelSerializer): author = UserSerializer() class Meta: model = NewsItem class NewsWriteSerializer(serializers.ModelSerializer): class Meta: model = NewsItem
class NewsList(ListCreateAPIView): queryset = NewsItem.objects.sorted('-pub_date') def get_serializer_class(self, *args, **kwargs): if self.request.method == 'GET': return NewsReadSerializer return NewsWriteSerializer class Meta: model = NewsModel
Отредактировано dun (Янв. 22, 2015 13:34:40)
Офлайн
class NewsWriteSerializer(models.Model)
Отредактировано GreyZmeem (Янв. 22, 2015 13:30:01)
Офлайн
GreyZmeemПоправил опечатку. Как правильно описать validate_author?
class NewsWriteSerializer(serializers.ModelSerializer): def validate_author(self): return self.request.user.id class Meta: model = NewsModel
Офлайн
Для DRF < 3
def validate_user(self, attrs, source): attrs.update({'user': self.context['request'].user}) return attrs
def validate_user(self, value): return self.context['request'].user
user = serializers.PrimaryKeyRelatedField(source='user', required=False)
from rest_framework import permissions class NewsList(class NewsList(ListCreateAPIView): permission_classes = [permissions.IsAuthenticated]
Отредактировано GreyZmeem (Янв. 22, 2015 14:48:11)
Офлайн
Поправил сериализатор, который использую для записи:
class NewsWriteSerializer(serializers.ModelSerializer): author = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), required=False) # В DRF 3 требуется указывать queryset для PrimaryKeyRelatedField, source уже не катит def validate_author(self, value): return self.context['request'].user class Meta: model = NewsModel fields = ('title', 'announce', 'full_text', 'author')
Отредактировано dun (Янв. 22, 2015 15:28:53)
Офлайн
Что-то они сильно заморочились с проверками в 3
Поколупался в исходниках. Вобщем должно быть утсановлены allow_null & default.
Иначе в Field.validate_empty_values() будет вызван метод get_default() который сделает raise SkipField и никакие валидаторы для этого поля не запустяться.
class TestModelSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField( queryset=User.objects.all(), allow_null=True, default=None ) def validate_user(self, value): return self.context['request'].user class Meta: model = models.TestModel
Офлайн
Спасибо большое за помощь! Именно так, как Вы написали, всё работает, как положено.
Офлайн