2012-10-05 18 views
5

¿Es posible incluir campos en los modelos relacionados, utilizando tastypie?Tastypie accediendo a los campos de los modelos heredados

Según mis modelos a continuación: si persisto un VideoContent y una instancia de TextContent en el DB, puedo recuperar 2 objetos de mi recurso de Contenido, sin embargo, ninguno de los campos adicionales está disponible.

¿Es posible incluir campos de modelos relacionados (en este caso, la URL del video y el contenido de texto) y servirá para agregar más tipos de contenido en el futuro sin tener que reescribir el recurso de contenido, o voy a venir? en esto desde la dirección equivocada?

El objetivo es ser capaz de extender esto con más TiposContenido sin tener que realizar cambios en el contenido de recursos (asumiendo que es posible hacerlo funcionar en el primer lugar)

Models.py:

class Content(models.Model): 
    parent = models.ForeignKey('Content', related_name='children', null=True, blank=True) 

class TextContent(Content): 
    text = models.CharField(max_length=100) 

class VideoContent(Content): 
    url = models.CharField(max_length=1000) 

y luego mis recursos:

class ContentResource(ModelResource): 
    children = fields.ToManyField('myapp.api.resources.ContentResource', 'children', null=True, full=True) 

    class Meta: 
     resource_name = 'content' 
     queryset = ContentResource.objects.all() 
     authorization = Authorization() 
     always_return_data = True 

Respuesta

2

he encontrado una buena solución en otra respuesta

Populating a tastypie resource for a multi-table inheritance Django model


me he encontrado con el mismo problema - aunque todavía estoy en el medio de resolverlo. Dos cosas que he descubierto hasta ahora:

django-model-utils proporciona un gestor de herencia que le permite utilizar la clase base abstracta para consultar su tabla y puede downcast automáticamente los resultados de la consulta.

Una cosa a mirar es los métodos dehydrate/rehydrate disponibles para las clases de recursos.

Esto es lo que hice:

class CommandResource(ModelResource): 

    class Meta: 
     queryset = Command.objects.select_subclasses().all() 

Eso sólo se consigue a mitad de camino - el recurso también debe incluir la deshidratado/rehidratar cosas porque hay que manualmente paquete de objeto para la transmisión (o recieving) del usuario.

Lo que me estoy dando cuenta ahora es que esto es super hacky y debe haber una forma mejor/limpia provista por tastypie - no pueden esperar que tenga que hacer este tipo de reenvasado manual en este tipo de situaciones - pero, tal vez lo hacen. Solo tengo unas 8 horas de experiencia con tastypie @ en este punto, así que si estoy explicando todo mal, quizás un buen usuario de stackoverflow me pueda aclarar. : D: D: D

0

Tuve el mismo requisito y finalmente lo resolví.

No me gustó la respuesta dada en el enlace anterior porque no me gustó la idea de combinar queryset y reordenar.

Aparentemente, puede heredar múltiples recursos.

Subclase de recursos múltiples, incluye los campos de los recursos.
Y dado que esos campos son únicos para cada recurso, los hice anulables en el init.

preguntarse si hay una forma de enumerar a los padres solo una vez. (Hay dos ahora. Uno para subclases, y uno en meta)

class SudaThreadResource(ThreadResource): 

    def __init__(self, *args, **kwargs): 
     super(SudaThreadResource, self).__init__(*args, **kwargs) 

     for field_name, field_object in self.fields.items(): 
      # inherited_fields can be null                                                          
      if field_name in self.Meta.inherited_fields: 
       field_object.null=True 

    class Meta(ThreadResource.Meta): 
     resource_name = 'thread_suda' 
     usedgoodthread_fields = UsedgoodThreadResource.Meta.fields[:] 
     userdiscountinfothread_fields = UserDiscountinfoThreadResource.Meta.fields[:] 
     staffdiscountinfothread_fields = StaffDiscountinfoThreadResource.Meta.fields[:] 
     bitem_checklistthread_fields = BitemChecklistThreadResource.Meta.fields[:] 

     parent_field_set = set(ThreadResource.Meta.fields[:]) 

     field_set = set(
      set(usedgoodthread_fields) | 
      set(userdiscountinfothread_fields) | 
      set(staffdiscountinfothread_fields) | 
      set(bitem_checklistthread_fields) 
     ) 

     fields = list(field_set) 
     inherited_fields = list(field_set - parent_field_set) 


     queryset = forum_models.Thread.objects.not_deleted().exclude(
      thread_type__in=(forum_const.THREAD_TYPE_MOMSDIARY, forum_const.THREAD_TYPE_SOCIAL_DISCOUNTINFO) 
     ).select_subclasses() 
Cuestiones relacionadas