【发布时间】:2013-09-27 18:05:03
【问题描述】:
Tom Christie 帮助我在正确的方向上使用 REST 框架,但我现在遇到了另一个问题:
注意:这是使用viewsets.ModelViewSet
在我的原始代码中,我可以在模型实例 xyz(它保存像“20x40x50”这样的坐标数据)上使用 zip() 和 split() 返回坐标 JSON 数据。 我调用了我自己的 toJSON() 函数来输出我需要的所有内容的 JSON 就绪输出。 结果是这样的:
[
{
"id" : "4"
"x" : "500",
"Y" : "80",
"z" : "150"
"color" : "yellow"
},
...
]
使用 REST Framework 序列化程序的问题是我只知道如何执行 serializers.Field(source"xyz") 的事情。我不知道如何将“x”“y”“z”作为单独的字段返回,而不是“xyz”作为一个大字段返回。
这是我的代码:
serializers.py:
---------------
class NoteSerializer(serializers.ModelSerializer):
owner = serializers.Field(source='owner.username')
firstname = serializers.Field(source='owner.first_name')
lastname = serializers.Field(source='owner.last_name')
x = ???
y = ???
z = ???
class Meta:
model = Note
fields = ('id','owner','firstname','lastname','text','color', 'x', 'y, 'z', 'time')
这是视图:
views.py:
---------
def list(self, request, format=None):
if request.method == 'GET':
queryset = Note.objects.filter(owner=request.user)
serializer = NoteSerializer(queryset, many=True)
if 'text' in request.GET:
if self.is_numeric(request.GET['id']) and self.is_numeric(request.GET['x']) and self.is_numeric(request.GET['y']) and self.is_numeric(request.GET['z']):
serializer = NoteSerializer(data=request.QUERY_PARAMS)
intx = int(float(request.GET['x']))
inty = int(float(request.GET['y']))
intz = int(float(request.GET['z']))
serializer.object.xyz = str(intx) +'x'+ str(inty) +'x'+ str(intz)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
def create(self, request, format=None):
serializer = NoteSerializer(data=request.DATA)
if serializer.is_valid():
serializer.object.owner = request.user
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
这是我的模型:
from django.db import models
import datetime
import json
from django.utils import timezone
from django.core.urlresolvers import reverse
from django.core import serializers
from django.contrib.auth.models import User
class Note(models.Model):
owner = models.ForeignKey('auth.User', null=True)
text = models.CharField(max_length=500)
color = models.CharField(max_length=20)
xyz = models.CharField(max_length=20)
time = models.DateTimeField((u"Note Creation Date and Time"), auto_now_add=True, blank=True)
def __unicode__(self):
return unicode(self.owner)
非常感谢您的帮助!我是 Python/Django/REST 的新手。这看起来很有趣,但是这几天让我很沮丧。
更新:
似乎我无法通过带有 serializer.object.xyz 的 views.py 访问 xyz。它说同样的错误“Nonetype has no attribute xyz”
serializer = NoteSerializer(data=request.QUERY_PARAMS)
intx = int(float(request.GET['x']))
inty = int(float(request.GET['y']))
intz = int(float(request.GET['z']))
serializer.object.xyz = str(intx) +'x'+ str(inty) +'x'+ str(intz)
serializer.save()
【问题讨论】:
-
你打算用同样的方式用api写那些值吗?
-
^ 好吧,我的意思是,我可以用另一种方式编写它,但我只是想知道 REST 框架是否可以,如果可以,过程会是什么?看来我需要使用自定义字段...但我不确定从哪里开始...
标签: python django json django-rest-framework