DjangoRestFramework - 正确添加“required = false”的方法到ModelSerializer字段? [英] DjangoRestFramework - correct way to add "required = false" to a ModelSerializer field?
问题描述
这是我的序列化程序:
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('user', 'post', 'reblog',)
def create(self, validated_data):
post = Post(
user = validated_data['user'],
post = validated_data['post'],
)
post.save()
# manually create a list of "reblog" users
post.reblog.add(validated_data['user'])
return post
这是我的模型:
class Post(models.Model):
user = models.ForeignKey(User)
post = models.CharField(max_length=400)
reblog = models.ManyToManyField(User)
现在,我不希望我的reblog字段在数据库中永远是空的(它可以是一个空列表,但不为null)。所以我没有在模型字段中设置null = True。然而,最终用户不必在创建帖子时提供reblog用户列表(我将在create()mtehod中手动进行)。
Now, I don't want my reblog field to ever be null in the database (it can be an empty list, but not null). So I did not set "null=True" in the model field. However, the end user should not have to provide a list of "reblog" users when creating a post (I'll do that manually in the create() mtehod).
我知道这里: http://www.django- rest-framework.org/api-guide/fields/#core-arguments 说,我可以向序列化程序字段添加required = false,但是我在我的序列化程序中使用的字段直接来自模型(即,fields =('reblog'))。
I know that here: http://www.django-rest-framework.org/api-guide/fields/#core-arguments it says I can add "required = false" to a serializer field but the fields I am using in my serializer are directly coming from the model (i.e., fields = ('reblog')).
从我的理解,我不能添加required = false到我的模型,因为这里:
https://docs.djangoproject.com/en/1.8/ref/models/字段/ 它没有提到必需作为模型字段的参数。
From my understanding, I can't add "required = false" to my model because here: https://docs.djangoproject.com/en/1.8/ref/models/fields/ it does not mention "required" as a parameter to a model field.
正如上所述,我如何获取我的reblogModelSerializer字段在serailzation / deserialization期间不需要?
With that said, how can I get my "reblog" ModelSerializer field to not be required during serailzation / deserialization?
编辑:处理发送请求的视图是:
the view which handles the post request sent is:
class post_list(APIView):
"""
List all posts or create a new post.
"""
permission_classes = (IsAuthenticated,)
def get(self, request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True)
return Response(serializer.data)
def post(self, request):
serializer = PostSerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
pip freeze:
pip freeze:
You are using pip version 6.1.1, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Django==1.8
djangorestframework==3.1.1
uWSGI==2.0.10
推荐答案
将参数 blank = True
添加到mod el字段:
Add the parameter blank=True
to the model field:
class Post(models.Model):
user = models.ForeignKey(User)
post = models.CharField(max_length=400)
reblog = models.ManyToManyField(User, blank=True)
#^^^^^^^^^^
现在,请求上可能会省略参数,但可能不会是 NULL
值。
Now, the parameter may be omitted on requests, but it may never be a NULL
value.
urls.py
(带有 serializers.py
基本上是内联的):
urls.py
(with serializers.py
essentially inlined):
from django.conf.urls import url, include
from rest_framework import routers, serializers, viewsets
from proj.models import Post
# Serializers define the API representation.
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ('user', 'post', 'reblog',)
def create(self, validated_data):
post = Post(
user = validated_data['user'],
post = validated_data['post'],
)
post.save()
# manually create a list of "reblog" users
post.reblog.add(validated_data['user'])
return post
class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'Post', PostViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
models.py
:
from django.contrib.auth.models import User
from django.db import models
class Post(models.Model):
user = models.ForeignKey(User)
post = models.CharField(max_length=400)
reblog = models.ManyToManyField(User, blank=True,related_name='reblog_users')
现在,当我发送POST请求:
Now, when I send the POST request:
{
"user": 1,
"post": "foo"
}
它返回:
{
"user": 1,
"post": "foo",
"reblog": [
1
]
}
pip freeze
:
Django==1.8.4
djangorestframework==3.2.4
这篇关于DjangoRestFramework - 正确添加“required = false”的方法到ModelSerializer字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!