2010-06-15 2 views
1

У меня есть модель с ManyToManyField для другой модели. Я хотел бы получить всю информацию о конкретной записи (включая соответствующую информацию из других моделей), которую возвращает JSON.django-piston: как получить значения от многих до многих полей?

Как получить джанго-поршень для отображения этих значений? Я был бы доволен только первичными ключами. Или вы можете предложить другой вариант?

ответ

2

Я могу ошибаться, но это должно сделать это:

class PersonHandler(BaseHandler): 
    model = Person 
    fields = ('id', ('friends', ('id', 'name')), 'name') 

    def read(self, request): 
     return Person.objects.filter(...) 
+0

Отлично! Абсолютно замечательный! Большое спасибо! –

1

Вы должны определить classmethod на обработчик, который возвращает многие-ко-многим данных, я не верю, что Поршень делает это автоматически ,

class MyHandler(BaseHandler): 
    model = MyModel 
    fields = ('myfield', 'mymanytomanyfield') 

    @classmethod 
    def mymanytomanyfield(cls, myinstance): 
     return myinstance.mymanytomanyfield.all() 
+0

Действительно? Как вызов метода класса на обработчике? Я не заметил никакой ссылки на это в документации ... Но тогда недокументированные функции меня не удивляют :( –

+0

wow, спасибо за подсказку! –

0

Мой код:

Модели:

class Tag(models.Model): 
"""docstring for Tags""" 
tag_name = models.CharField(max_length=20, blank=True) 
create_time = models.DateTimeField(auto_now_add=True) 

def __unicode__(self): 
    return self.tag_name 
class Author(models.Model): 
"""docstring for Author""" 
name = models.CharField(max_length=30) 
email = models.EmailField(blank=True) 
website = models.URLField(blank=True) 

def __unicode__(self): 
    return u'%s' % (self.name) 

class Blog(models.Model): 
"""docstring for Blogs""" 
caption = models.CharField(max_length=50) 
author = models.ForeignKey(Author) 
tags = models.ManyToManyField(Tag, blank=True) 
content = models.TextField() 
publish_time = models.DateTimeField(auto_now_add=True) 
update_time = models.DateTimeField(auto_now=True) 

def __unicode__(self): 
    return u'%s %s %s' % (self.caption, self.author, self.publish_time) 

Ручка:

class BlogAndTagsHandler(BaseHandler): 
allowed_methods = ('GET',) 
model = Blog 
fields = ('id' 'caption', 'author',('tags',('id', 'tag_name')), 'content', 'publish_time', 'update_time') 

def read(self, request, _id=None): 
    """ 
    Returns a single post if `blogpost_id` is given, 
    otherwise a subset. 

    """ 
    base = Blog.objects 

    if _id: 
     return base.get(id=_id) 
    else: 
     return base.all() # Or base.filter(...) 

Работы Мелкая хорошо.