Django REST框架并从POST表单创建两个表条目

时间:2014-06-14 07:55:56

标签: django django-rest-framework

我想使用DRF Browseable API POST表单在两个表(Log和Post)中创建条目。

以下示例是设计的,但它概述了我要做的事情。

class Post(models.Model):
    info = models.CharField()

class Log(TimeStampedModel):
    ip = models.GenericIPAddressField(('IP Address'))
    name = models.CharField()
    data = models.ForeignKey(Post)                                       

我想使用可浏览的API提交表单来创建日志条目。以下是序列化器:

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ('info',)

class LogSerializer(serializers.ModelSerializer):                          
    data = serializers.Field()

    class Meta:
        model = Log
        fields = ('ip', 'name', 'data')

上述问题是serializer.Field是只读的,因此不会显示在POST表单上。如果我将它更改为CharField它会显示,但后来我收到一个错误,因为Post的实例不仅仅是Post对象的一个​​字段。

以下是我的观点:

class LogMixin(object):
    queryset = Log.objects.all()                                           
    serializer_class = LogSerializer



class LogList(LogMixin, ListCreateAPIView):
    pass


class LogDetail(LogMixin, RetrieveUpdateDestroyAPIView):
    pass

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

从我可以告诉你想要创建一个嵌套的Log对象。有两种方法可以做到这一点:

  1. 发送2 POST个请求,一个用于创建帖子,另一个用于创建包含从API接收的HTTP 200数据的日志。
  2. (Django和最佳方式)将数据全部发送到一个POST并解析服务器端。 Django Rest Framework为您解决了这个问题。
  3. 我已更改您的代码,以便它可以正常工作。 Source

    class LogSerializer(serializers.ModelSerializer):                          
       class Meta:
            model = Log
            fields = ('ip', 'name')
    
    
    class PostSerializer(serializers.ModelSerializer):
        log = LogSerializer()
        class Meta:
            model = Post
            fields = ('info', 'log')
    

    views.py

    import generics
    
    class PostCreateAPIView(generics.CreateAPIView):
        model = Post
        serializer_class = PostSerializer
    

    然后您可以发送包含'info','ip'和'name'的POST请求。