不能在活塞中排除用户的ForeignKey字段

时间:2011-02-09 10:57:51

标签: django django-piston

我有这个型号:

# 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活动webservice的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": "b@a.as", 
        "date_joined": "2011-02-02 10:49:48"
    },
}

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

  

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

除了“(除非被覆盖。)”案例似乎没有得到正确处理外,这一切都很好。

认为在emitters.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中修补它会很好。

干杯!

答案 1 :(得分:0)

我认为你不必要地嵌套了作者字段。

看起来您的字段属性应改为:

fields = ("title", "author", ("username",))

来自活塞文档...

class UserHandler(BaseHandler):
      model = User
      fields = ('name', 'posts', ('title', 'date'))

will show the title and date from a users posts.