Как объединить несколько ресурсов в django-tastypie?

Допустим, у меня есть три модели Submission, Contact и SubmissionContact.

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 с помощью deliciouspie. (в основном получайте и добавляйте действия в список и детализируйте во вкусняшке)

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


person Giri    schedule 27.06.2012    source источник


Ответы (1)


Вы можете вложить одну модель в другую или использовать цикл обезвоживания, чтобы добавить дополнительные ресурсы к выходным данным, например, рассмотрите модель 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
person Hedde van der Heide    schedule 27.06.2012
comment
Вероятно, вы могли бы уменьшить нагрузку на базу данных, изменив queryset = Foo.objects.all() на queryset = Foo.objects.select_related('bar').all(). - person SpoonMeiser; 12.02.2016