我想使用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
这样做的正确方法是什么?
答案 0 :(得分:1)
从我可以告诉你想要创建一个嵌套的Log对象。有两种方法可以做到这一点:
POST
个请求,一个用于创建帖子,另一个用于创建包含从API接收的HTTP 200数据的日志。POST
并解析服务器端。 Django Rest Framework为您解决了这个问题。我已更改您的代码,以便它可以正常工作。 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
请求。