DjangoRestFramework - 将 "required = false"添加到 ModelSerializer 字段的正确方法?

标签 django serialization deserialization django-rest-framework

这是我的序列化器:

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=True”。但是,最终用户在创建帖子时不必提供“转发”用户列表(我将在 create() mtehod 中手动执行)。

我知道这里:http://www.django-rest-framework.org/api-guide/fields/#core-arguments它说我可以将“required = false”添加到序列化器字段,但我在序列化器中使用的字段直接来自模型(即 fields = ('reblog'))。

根据我的理解,我不能将“required = false”添加到我的模型中,因为这里: https://docs.djangoproject.com/en/1.8/ref/models/fields/它没有提到“必需”作为模型字段的参数。

话虽如此,我怎样才能让我的“reblog”ModelSerializer 字段在序列化/反序列化期间不再需要?

编辑:处理发送的发布请求的 View 是:

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)

点卡住:

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添加到模型字段:

class Post(models.Model):
    user = models.ForeignKey(User)
    post = models.CharField(max_length=400)
    reblog = models.ManyToManyField(User, blank=True)
                                         #^^^^^^^^^^

现在,请求中可能会省略该参数,但它可能永远不会是 NULL 值。

现在总的来说:

urls.py(本质上是内联的 serializers.py):

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 请求时:

{
    "user": 1,
    "post": "foo"
}

它返回:

{
    "user": 1,
    "post": "foo",
    "reblog": [
        1
    ]
}

点卡住:

Django==1.8.4
djangorestframework==3.2.4

关于DjangoRestFramework - 将 "required = false"添加到 ModelSerializer 字段的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33001834/

相关文章:

python - 找到 django/contrib/admin/templates

python - 具有 session 范围的 PyTest fixture 不保持数据库数据的连续性

Java : Serializable not working to save Object's states

python - 公开 EVP_MD_CTX 的 _hashlib.pyd 内部结构吗?

django - 警告 : Unexpected input(s) . ..,有效输入位于 GitHub Actions 中(答案正文中的全文)

python - BooleanField 未更新 : Django

java - Protobuf - 序列化和反序列化中参数的不同命名

java - jackson JSON 反序列化 : array elements in each line

c# - 使用 C# 从 URL 反序列化 XML

c# - 使用内存流序列化/反序列化