我有这个模型:

# models.py
from django.contrib.auth.models import User

class Test(models.Model):
    author = models.ForeignKey(User, related_name="tests")
    title = models.CharField(_("title"), max_length=100)


然后在Django活塞Web服务的api文件夹中:

class TestHandler(BaseHandler):
    allowed_methods = ("GET")
    model = Test
    fields = ("title", ("author", ("username",)))

    def read(self, request, id):
        base = self.model.objects
        try:
            r = base.get(pk=id)
            return r
        except:
            return rc.NOT_FOUND


如果我调用此网络服务,则会得到:

{
    "title": "A test"
    "author": {
        "username": "menda",
        "first_name": "",
        "last_name": "",
        "is_active": true,
        "is_superuser": true,
        "is_staff": true,
        "last_login": "2011-02-09 10:39:02",
        "password": "sha1$83f15$feb85449bdae1a55f3ad5b41a601dbdb35c844b7",
        "email": "[email protected]",
        "date_joined": "2011-02-02 10:49:48"
    },
}


我也尝试过使用exclude,但是它也不起作用。

如何仅获取author的用户名?
谢谢!

最佳答案

好的,问题在于,Piston正在使用另一个Handler类在User模型上定义的字段集,而不是此处指定的嵌套字段。

另一个用户在这里在活塞讨论组中提到了完全相同的问题:

http://groups.google.com/group/django-piston/browse_thread/thread/295de704615ee9bd

该问题显然是由Piston的序列化代码中的错误引起的。
用文档的话来说:


通过在处理程序中使用模型,Piston会记住您的字段/排除指令,并在其他返回该类型对象的处理程序中使用它们(除非被覆盖)。


一切都很好,除了“(除非重写。)”的情况似乎没有得到正确处理。

我认为,稍微修改一下generators.py可能会解决此问题(第160-193行)...

if handler:
    fields = getattr(handler, 'fields')
if not fields or hasattr(handler, 'fields'):
    ...dostuff...
else:
    get_fields = set(fields)


应该读什么(也许?)

if fields:
    get_fields = set(fields)
else:
    if handler:
        fields = getattr(handler, 'fields')
    ...dostuff...


如果您确实决定尝试对emitters.py进行修补,请告诉我是否可以解决问题-最好在django-piston中对其进行修补。

干杯!

10-02 13:57