2012-06-27 1 views
3

Допустим, у меня есть три модели Подача, контакт и отправкаКонтакт.Как объединить несколько ресурсов в django-tastypie?

class Submission(models.Model): 
    title = models.CharField(max_length=255, verbose_name='Title') 
    ... 

class Contact(models.Model): 
    name = models.CharField(max_length=200, verbose_name='Contact Name') 
    email = models.CharField(max_length=80, verbose_name='Contact Email') 
    ... 

class SubmissionContact(models.Model): 
    submission = models.ForeignKey(Submission) 
    contact = models.Foreign(Contact, verbose_name='Contact(s)') 

Могу ли я читать/писать во все эти три таблицы, используя один ModelResource, используя tastypie. (в основном получать и ставить действия по списку и деталям в tastypie)

Заранее благодарим за любую помощь.

ответ

4

Вы можете вложить одну модель в другую или использовать обезвоживает цикл, чтобы добавить дополнительные ресурсы для производства, например, рассмотрим модель Foo и Bar

class FooResource(ModelResource): 
    class Meta: 
     queryset = Foo.objects.all() 
     resource_name = 'foo' 
     serializer = Serializer(formats=['xml', 'json']) 
     excludes = ['date_created'] 

class BarResource(ModelResource): 
    foo = fields.ForeignKey(FooResource, attribute='foo', full=True, null=True) 

    class Meta: 
     queryset = Bar.objects.all() 
     resource_name = 'bar' 
     serializer = Serializer(formats=['xml', 'json']) 

Если нет никакой связи вы могли бы также сделать что-то вроде (с большими наборами данных это вызовет много накладных расходов базы данных, возможно, придется пересмотреть свои определения модели):

class FooResource(ModelResource): 
    class Meta: 
     queryset = Foo.objects.all() 
     resource_name = 'foo' 
     serializer = Serializer(formats=['xml', 'json']) 
     excludes = ['date_created'] 

    def dehydrate(self, bundle): 
     obj = self.obj_get(id=bundle.data['id']) 
     bundle.data['bar'] = Bar.objects.get(id=1).name 
     return bundle 
+0

вы могли бы уменьшить нагрузку базы данных путем изменения 'QuerySet = Foo.objects.all()' в 'queryset = Foo.objects.select_related ('bar'). all()' – SpoonMeiser