标签: django-serializer

Django Rest Framework - 如何为所有ModelSerializer字段创建自定义错误消息?

这是我的serializers.py(我想为内置的User模型创建一个序列化器):

from rest_framework import serializers

from django.contrib.auth.models import User

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )
Run Code Online (Sandbox Code Playgroud)

我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:

{'username': [u'This field must be unique.']}
Run Code Online (Sandbox Code Playgroud)

我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".

它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:

{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
Run Code Online (Sandbox Code Playgroud)

我想自定义正则表达式验证器,以便它只是说"无效的用户名".

如何自定义每个字段的所有错误消息?

注意:根据这篇文章:Django Rest Framework序列化程序中的自定义错误消息我可以这样做:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User

    def __init__(self, *args, **kwargs):
        super(UserSerializer, self).__init__(*args, **kwargs)

        self.fields['username'].error_messages['required'] = u'My custom required msg'
Run Code Online (Sandbox Code Playgroud)

但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了

self.fields['username'].error_messages['regex'] = u'My custom …
Run Code Online (Sandbox Code Playgroud)

django validation error-handling django-serializer django-rest-framework

7
推荐指数
1
解决办法
2630
查看次数

如何使用Model serializer在django-rest中序列化一对多关系?

这些是我的模型和序列化器.我想要一个问题模型的表示以及要求问题的人员列表.

我在尝试这个:

@api_view(['GET', 'PATCH'])
def questions_by_id(request,user,pk):
    question = Question.objects.get(pk=pk)
    if request.method == 'GET':
        serializer = QuestionSerializer(question)
        return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

但我得到一个空字典({}).但是当我asked从中移除字段时,QuestionSerializer我会得到一个完整的表示Question以及Places序列化.我错过了什么?

class AskedToSerializer(serializers.ModelSerializer):
    class Meta:
        model = AskedTo
        fields = ('to_user', 'answered')

class QuestionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Question
        places = PlaceSerializer(many=True, required=False)
        asked = AskedToSerializer(source='askedto_set', many=True)
        fields = ('id', 'created_on', 'title', 'places', 'answered','asked')
        extra_kwargs = {'created_by': {'read_only': True}}

class Question(BaseModel):
    title = models.CharField(max_length=200, null=False)
    places = models.ManyToManyField(Place, blank=True)
    answered = models.BooleanField(default=False) …
Run Code Online (Sandbox Code Playgroud)

python serialization one-to-many django-serializer django-rest-framework

7
推荐指数
2
解决办法
7561
查看次数

django-rest-framework序列化器在多个视图中的不同字段

我是Django的新手,无法找到问题的解决方案.

问题是在使用不同视图的情况下强制特定的序列化器包括不同数量的字段.我想在第一个视图中使用'id'字段,在第二个视图中使用'id'和'name'字段.

这是我的model.py

class Processing(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField()
    description = models.CharField()
Run Code Online (Sandbox Code Playgroud)

这是我的serializer.py

class ProcessingSerializer(serializers.ModelSerializer):
    id = serializers.ModelField(model_field=Processing()._meta.get_field('id'))
    class Meta:
        model = Processing
        fields = ('id', 'name')
Run Code Online (Sandbox Code Playgroud)

欢迎任何帮助.

django django-serializer django-rest-framework

7
推荐指数
2
解决办法
2966
查看次数

在 GET 中隐藏密码字段,但在 Django REST Framework 中隐藏密码字段,其中序列化程序中的 depth=1

我有 2 个模型:User 和 UserSummary。UserSummary 有一个 User 的外键。我只是注意到,如果我depth= 1在 内设置UserSummarySerializer,则密码字段将包含在输出中。它被散列,但最好还是排除这个字段。

为了隐藏密码字段,我刚刚在序列化程序中明确设置了用户字段,就像这样:

class UserSerializer(serializers.ModelSerializer):
    """A serializer for our user profile objects."""

    class Meta:
        model = models.User
       extra_kwargs = {'password': {'write_only': True}}
        exclude = ('groups', 'last_login', 'is_superuser', 'user_permissions', 'created_at')

    def create(self, validated_data):
        """Create and return a new user."""

        user = models.User(
            email = validated_data['email'],
            firstname = validated_data['firstname'],
            lastname = validated_data['lastname'],
            mobile = validated_data['mobile']
        )

        user.set_password(validated_data['password'])
        user.save()

        return user


class UserSummarySerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = models.UserSummary …
Run Code Online (Sandbox Code Playgroud)

python django rest django-serializer django-rest-framework

7
推荐指数
3
解决办法
5175
查看次数

为什么 DjangoRF 序列化器 is_valid 是假的?

我的课

class SprintSerializer(serializers.ModelSerializer):

    links = serializers.SerializerMethodField()

    class Meta:
        model = Sprint
        fields = ('id', 'name', 'description', 'end', 'links', )
Run Code Online (Sandbox Code Playgroud)

在我的 shell 中,我用数据填充了一个序列化器

serializer = SprintSerializer(data=({'name':'JHolmes','description':'ambassador','end':'2019-01-27T15:17:10.375877'}))
Run Code Online (Sandbox Code Playgroud)

然后

serializer.data
{'name': 'JHolmes', 'description': 'ambassador', 'end': '2019-01-27T15:17:10.375877'}
serializer.validated_data
{}
serializer.is_valid()
False
Run Code Online (Sandbox Code Playgroud)

为什么实例序列化器是 False?编辑正如 Berry 指出的那样,数据格式是错误的

serializer.errors
{'end': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}
Run Code Online (Sandbox Code Playgroud)

已解决问题

'end':'2019-01-27'
serializer.is_valid()
True
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework

7
推荐指数
2
解决办法
2500
查看次数

Django Rest Framework 序列化器 create() 不会被触发

我有以下序列化程序

class MyModelSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    def create(self, validated_data):
        print("TEST")
        MyModel, created = MyModel.objects.get_or_create(**validated_data)
        return MyModel

    class Meta:
        model = MyModel
        fields = ('pk', 'title', 'user', 'movie', 'timestamp', 'text',)
Run Code Online (Sandbox Code Playgroud)

以及以下视图集:

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
Run Code Online (Sandbox Code Playgroud)

当我POST向指定视图集对应的端点发出请求时,该create()方法完全不执行任何操作。TEST如您所见,我试图在控制台中打印出来,但什么也没有。

有没有人知道这种奇怪的行为?

先谢谢了!

编辑:API 调用:

return axios({
  method: 'post',
  url: 'http://localhost:8000/api/mymodel/',
  data: {
     title: this.title,
     movie: this.id,
     text: this.text,
     user: this.user
}
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework

7
推荐指数
1
解决办法
6322
查看次数

Django DRF 将 request.user 添加到模型序列化器

我正在使用 django rest 框架,并且我有一个通过模型视图集和模型序列化器创建的对象。此视图只能由经过身份验证的用户访问,并且对象应将其“uploaded_by”字段设置为该用户。

我已经阅读了文档,并得出结论,这应该可行

视图集:

class FooViewset(viewsets.ModelViewSet):
    permission_classes = [permissions.IsAdminUser]
    queryset = Foo.objects.all()
    serializer_class = FooSerializer

    def get_serializer_context(self):
        return {"request": self.request}
Run Code Online (Sandbox Code Playgroud)

序列化器:

class FooSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault()
    )

    class Meta:
        model = Foo
        fields = "__all__"
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: bar_foo.uploaded_by_id
Run Code Online (Sandbox Code Playgroud)

这表明序列化程序没有填充“uploaded_by”。

根据我对文档的理解,这应该已将该字段添加到来自序列化程序的验证数据中,作为 create 方法的一部分。

显然我误解了一些东西!

django django-serializer django-rest-framework django-rest-viewsets

7
推荐指数
1
解决办法
3061
查看次数

在 Django 的 Rest 框架中,如何关闭序列化器中某些字段的验证?

我正在使用 Django 3、Python 3.8 和 Django Rest 框架。此外,我正在使用这里的地址模块 - https://github.com/furious-luke/django-address。我已经为地址对象构建了以下序列化器以及我自己的序列化器之一依赖于它们......

class CountrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields = ['id', 'name', 'code']

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        return rep


class StateSerializer(serializers.ModelSerializer):
    country = CountrySerializer()
    class Meta:
        model = State
        fields = ['id', 'code', 'country']

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['country'] = CountrySerializer(instance.country).data
        return rep


class LocalitySerializer(serializers.ModelSerializer):
    state = StateSerializer()
    class Meta:
        model = Locality
        fields = ['id', 'name', 'postal_code', 'state']

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        rep['state'] …
Run Code Online (Sandbox Code Playgroud)

django django-validation python-3.x django-serializer django-rest-framework

7
推荐指数
2
解决办法
1万
查看次数

DjangoRestFramework - 如何使用模型序列化程序访问 OneToOneField 反向关系的其他字段?

我正在使用默认的 User 模型,并且还使用 UserExtended 模型对其进行了扩展:

class Country(models.Model):
    countryName = models.CharField(max_length=50, unique=True)
    countryCode = models.CharField(max_length=10, unique=True)

class UserExtended(models.Model):
    user = models.OneToOneField(User, related_name="userextended")
    country = models.ForeignKey(Country)
Run Code Online (Sandbox Code Playgroud)

我正在尝试遵循此处记录的内容:http : //www.django-rest-framework.org/api-guide/relations/#reverse-relations

这是我的 UserSerializer:

class UserSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
            super(UserSerializer, self).__init__(*args, **kwargs) # call the super() 
            for field in self.fields: # iterate over the serializer fields
                self.fields[field].error_messages['required'] = 'Enter a valid %s.'%field # set the custom error message

    class Meta:
        model = User
        fields = ('username', 'password', 'email', 'userextended')

        extra_kwargs = {
                    'password': …
Run Code Online (Sandbox Code Playgroud)

django django-models django-serializer django-rest-framework

6
推荐指数
1
解决办法
1695
查看次数

Django Rest Framework 中使用的解析器是什么?

我有一个简单的文件模型

class Documents(models.Model):
    """ uploaded documents"""

    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    upload = models.FileField(storage=PrivateMediaStorage())
    filename = models.CharField(_('documents name'), max_length=255, blank=True, null=True)
    datafile = models.FileField()
    created = models.DateTimeField(auto_now_add=True)
    type = models.ForeignKey(Doctype, on_delete=models.CASCADE, blank=True)
Run Code Online (Sandbox Code Playgroud)

要显示上传的文档列表并添加新文件,我使用了类

class DocumentsListView(viewsets.ViewSetMixin,generics.ListCreateAPIView):
    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
Run Code Online (Sandbox Code Playgroud)

序列化程序.py

class DocumentsSerializer(AwsUrlMixin, serializers.ModelSerializer):
    type_name = serializers.CharField(source='type.type', read_only=True)
    type = serializers.PrimaryKeyRelatedField(queryset=Doctype.objects.all())
    view_file = serializers.SerializerMethodField()
    author = serializers.CharField(source='author.username', read_only=True)
    created = serializers.DateTimeField(format=date_format, input_formats=None, default_timezone=None, read_only=True)

    class Meta:
        model = Documents
        fields = ('id', 'author', 'filename', 'datafile', 'type', …
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework

6
推荐指数
2
解决办法
3585
查看次数