这是我的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', )
我知道Django Rest Framework有它自己的字段验证器,因为当我尝试使用已经存在的用户名创建用户时,它会引发一个错误:
{'username': [u'This field must be unique.']}
我想自定义错误消息并让它说"此用户名已被占用.请再试一次"而不是说"此字段必须是唯一的".
它还有一个内置的正则表达式验证器,因为当我创建带有感叹号的用户名时,它会说:
{'username': [u'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.']}
我想自定义正则表达式验证器,以便它只是说"无效的用户名".
如何自定义每个字段的所有错误消息?
注意:根据这篇文章: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'
但是我如何为"独特"和"正则表达式"验证器做些什么呢?我试过了
self.fields['username'].error_messages['regex'] = u'My custom …django validation error-handling django-serializer django-rest-framework
这些是我的模型和序列化器.我想要一个问题模型的表示以及要求问题的人员列表.
我在尝试这个:
@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)
但我得到一个空字典({}).但是当我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) …python serialization one-to-many django-serializer 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()
这是我的serializer.py
class ProcessingSerializer(serializers.ModelSerializer):
    id = serializers.ModelField(model_field=Processing()._meta.get_field('id'))
    class Meta:
        model = Processing
        fields = ('id', 'name')
欢迎任何帮助.
我有 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 …我的课
class SprintSerializer(serializers.ModelSerializer):
    links = serializers.SerializerMethodField()
    class Meta:
        model = Sprint
        fields = ('id', 'name', 'description', 'end', 'links', )
在我的 shell 中,我用数据填充了一个序列化器
serializer = SprintSerializer(data=({'name':'JHolmes','description':'ambassador','end':'2019-01-27T15:17:10.375877'}))
然后
serializer.data
{'name': 'JHolmes', 'description': 'ambassador', 'end': '2019-01-27T15:17:10.375877'}
serializer.validated_data
{}
serializer.is_valid()
False
为什么实例序列化器是 False?编辑正如 Berry 指出的那样,数据格式是错误的
serializer.errors
{'end': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}
已解决问题
'end':'2019-01-27'
serializer.is_valid()
True
我有以下序列化程序
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',)
以及以下视图集:
class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
当我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
}
我正在使用 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}
序列化器:
class FooSerializer(serializers.ModelSerializer):
    uploaded_by = serializers.PrimaryKeyRelatedField(
        read_only=True, default=serializers.CurrentUserDefault()
    )
    class Meta:
        model = Foo
        fields = "__all__"
但是,这会导致以下错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: bar_foo.uploaded_by_id
这表明序列化程序没有填充“uploaded_by”。
根据我对文档的理解,这应该已将该字段添加到来自序列化程序的验证数据中,作为 create 方法的一部分。
显然我误解了一些东西!
django django-serializer django-rest-framework django-rest-viewsets
我正在使用 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'] …django django-validation python-3.x django-serializer django-rest-framework
我正在使用默认的 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)
我正在尝试遵循此处记录的内容: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': …django django-models django-serializer 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)
要显示上传的文档列表并添加新文件,我使用了类
class DocumentsListView(viewsets.ViewSetMixin,generics.ListCreateAPIView):
    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer
    def perform_create(self, serializer):
        serializer.save(author=self.request.user)
序列化程序.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', …