Не удается исключить поля ForeignKey для пользователя в поршне - PullRequest
4 голосов
/ 09 февраля 2011

У меня есть эта модель:

# 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)

Затем в папке api для веб-службы Django Piston:

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 ]

2 голосов
/ 11 февраля 2011

Хорошо, проблема в том, что Piston использует набор полей, определенных в модели User другим классом Handler, а не указанные здесь вложенные поля.

Другой пользователь ссылается на точно такую ​​же проблему вгруппа обсуждения поршня здесь:

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

Проблема, очевидно, вызвана ошибкой в ​​коде сериализации Piston.В словах документации:

Используя модель в обработчике, Piston запоминает ваши поля / директивы exclude и использует их в других обработчиках, которые возвращают объекты этого типа (если не переопределены.)

Все это хорошо, за исключением того, что дело "(если не отменено.)", Похоже, не обрабатывается правильно.

I думаю , что небольшоемодификация в 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-поршне.

Приветствия!

0 голосов
/ 09 февраля 2011

Я думаю, что вы излишне вкладываете поле автора.

Похоже, что ваш атрибут поля должен вместо этого читать:

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

Из документов поршня ...

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

will show the title and date from a users posts.
...