Django Rest框架 - 创建而不提供外键值 [英] Django Rest Framework - Create without providing a foreign key value

查看:166
本文介绍了Django Rest框架 - 创建而不提供外键值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Django-Rest-Framework构建我的第一个API,我有一点困难的验证过程。希望这是一个简单的答案,但我无法从6部分的介绍教程中找出来。



我有一个模型:

 类XYZMeta(models.Model):
id = models.AutoField(primary_key = True)
xyz_id = models.ForeignKey XYZ)
user_id = models.ForeignKey(User)
field_name = models.CharField(blank = True,max_length = 50)
value = models.TextField(blank = True)

和序列化程序:

  class XYZMetaSerializer(serializers.ModelSerializer):
class Meta:
model = XYZMeta
fields =('id','xyz_id','user_id','field_name','value ')

另见一个视图:

 类XYZMetaViewSet(viewsets.ModelViewSet):

允许查看或编辑xyz元数据的API端点

queryset = XYZMeta.objects.all()
serializer_class = serial izers.XYZMetaSerializer

def perform_create(self,serializer):
serializer.save(user_id = self.request.user)

当我发送一个POST来创建一个新的对象时,它工作得很好,使用授权用户的ID,而不是我提供的任何值。示例:

 > curl -X POST -HContent-Type:application / json-d'{xyz_id:12345,**user_id:2 **,field_name:abc,value abc comment}'-u admin:admin http:// mysite / xyzmeta / 
{id:2,dealer_id:12345,**user_id:1 **,field_name abc,value:abc comment,create_date:2015-02-22T23:32:27.928991Z}

但是,如果我完全离开user_id(因为这并不重要),我收到一个需要该字段的错误:

 > curl -X POST -HContent-Type:application / json-d'{xyz_id:12345,field_name:abc,value:abc comment}'-u admin:admin http:// mysite / xyzmeta / 
{user_id:[此字段为必填项。]}

如何指定我想要在创建过程中以编程方式设置user_id外键字段,而不必提供一个虚拟值?

解决方案

一种方法:使 user_id 字段不需要

  class XYZMetaSerializer(serializers.ModelSerializer):
class Meta:
model = XYZMeta
fields =('id','xyz_id','user_id','field_name ','value')
extra_kwargs = {
'user_id':{'required':False}
}

另一种方法:在 request.data -rest框架/斑点/主/ rest_fram ework / mixins.py#L18rel =nofollow> get_serializer(data = request.data) 方法调用。

 类XYZMetaViewSet(viewsets.ModelViewSet):

允许查看或编辑xyz元数据的API端点。

queryset = XYZMeta.objects.all()
serializer_class = serializers.XYZMetaSerializer

def create(self,request,* args,** kwargs )
request.data ['user_id'] = request.user.id
return super(self .__ class__,self).create(request,* args,** kwargs)


I'm building my first API with Django-Rest-Framework and I'm a little stuck with the validation process. Hopefully this is an easy answer but I couldn't figure it out from the 6-part intro tutorial...

I have a model:

class XYZMeta(models.Model):
    id = models.AutoField(primary_key=True)
    xyz_id = models.ForeignKey(XYZ)
    user_id = models.ForeignKey(User)
    field_name = models.CharField(blank=True, max_length=50)
    value = models.TextField(blank=True)

And a serializer:

class XYZMetaSerializer(serializers.ModelSerializer):
    class Meta:
        model = XYZMeta
        fields = ('id', 'xyz_id', 'user_id', 'field_name', 'value')

And a view:

class XYZMetaViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows xyz metadata to be viewed or edited.
    """
    queryset = XYZMeta.objects.all()
    serializer_class = serializers.XYZMetaSerializer

    def perform_create(self, serializer):
        serializer.save(user_id=self.request.user)

When I send a POST to create a new object, it works great and uses the ID of the authorized user rather than whatever value I provide. Example:

> curl -X POST -H "Content-Type:application/json" -d '{"xyz_id":"12345",**"user_id":2**,"field_name":"abc","value":"abc comment"}' -u admin:admin http://mysite/xyzmeta/
{"id":2,"dealer_id":12345,**"user_id":1**,"field_name":"abc","value":"abc comment","create_date":"2015-02-22T23:32:27.928991Z"}

However, if I leave the user_id off entirely (since it doesn't matter anyway), I get an error that the field is required:

> curl -X POST -H "Content-Type:application/json" -d '{"xyz_id":"12345","field_name":"abc","value":"abc comment"}' -u admin:admin http://mysite/xyzmeta/
{"user_id":["This field is required."]}

How do I specify that I want the user_id foreign key field to be programmatically set during the create process, and not have to provide a dummy value?

解决方案

One approach: make user_id field non-required

class XYZMetaSerializer(serializers.ModelSerializer):
    class Meta:
        model = XYZMeta
        fields = ('id', 'xyz_id', 'user_id', 'field_name', 'value')
        extra_kwargs = {
            'user_id': {'required': False}
        }

Another approach: alter request.data before the get_serializer(data=request.data) method call.

class XYZMetaViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows xyz metadata to be viewed or edited.
    """
    queryset = XYZMeta.objects.all()
    serializer_class = serializers.XYZMetaSerializer

    def create(self, request, *args, **kwargs):
        request.data['user_id'] = request.user.id
        return super(self.__class__, self).create(request, *args, **kwargs)

这篇关于Django Rest框架 - 创建而不提供外键值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆