2016-05-12 42 views
2

我有一个模型,我已经重写了id作为CharField和主键。这里的模型及其串行:Django REST框架:如何使POST在POST时需要Id字段,即非只读字段?

class Tool(models.Model): 
    id = models.CharField(max_length=10000, primary_key=True, default=uuid.uuid4, editable=False) 
    description = models.TextField(null=True, blank=True) 
    ... 

class ToolSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = Tool 
     fields = (
      'id', 
      'description', 
      ... 
     ) 

默认情况下,Django的REST框架,标志着id场为只读,并且不需要它在POST请求。但是我希望它是可写的,并且在POST时需要它。我如何实现这一目标?

+0

只是一个好奇心,你为什么需要这个? –

回答

3

我想,我发现在一个意想不到的地方DRF文件的答案:

http://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update

我需要在串行创建一个明确的id场这样的:

class ToolSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.CharField() 

    class Meta: 
     model = Tool 
     fields = (
      'id', 
      'description', 
      ... 
     ) 

这将覆盖默认ID字段,创建为只读。

+0

它工作吗?它真的更新数据库中的PK域吗? –

+0

是的,它肯定适用于GET,POST和DELETE请求,我正在调试PUT。我决定这样做是因为没有工具名称是唯一的,我可以向大家展示他们的名字(因此在网址中使用工具名称)。那么为什么不使用名称作为主要ID?在这种情况下,在POST后,您必须为工具指定'id',所以我必须使'id'字段不可读。 –

+1

@KarinaKlinkevičiūtė只是偶然发现了创建可写'id'字段的另一个原因:在ListSerializers上实现更新:http://www.django-rest-framework.org/api-guide/serializers/#customizing-multiple-update –

相关问题