2017-08-16 2 views
0

Je l'ai presque fonctionné.Obtenir une valeur de champ à partir d'un champ via un widget ForeignKey à l'envers avec django-import-export

Modèles:

class Child(models.Model): 
    parent = models.ForeignKey('project.Parent') 
    name = models.CharField(max_length=100) 

class Parent(models.Model): 
    text = models.CharField(max_length=100) 

ressources:

class ParentResource(resources.ModelResource): 
    children = fields.Field(widget=widgets.ForeignKeyWidget(Parent)) 

    class Meta: 
     model = Parent 
     use_transactions = True 
     fields = ('text', 'children__child__name') 

Alors la vue appelle la ressource et télécharge. Le problème est que le nom est vide. Donc, tout le reste fonctionne bien, mais je ne peux pas obtenir child.name pour apparaître. Qu'est-ce que je rate?

Répondre

0

Tout d'abord, widgets.ForeignKeyWidget est utilisé par modela pour rechercher un modelB connexe qui est un ForeignKey de modela.

I.e. un ChildResource peut utiliser widgets.ForeignKeyWidget pour rechercher un Parent, mais pas vice versa.

Faire en sens inverse, à savoir la boucle et/ou afficher certains champs d'un ensemble de Childs (qui a un ForeignKeyParent) à partir d'un ParentResource, vous devez faire quelque chose comme ceci:

from import_export import fields, resources 
from .models import Parent 


class ParentResource(resources.ModelResource): 

    children = fields.Field() 

    class Meta: 
     model = Parent 
     use_transactions = True 
     fields = ('text', 'children') 

    def dehydrate_children(self, parent): 
     children = list(parent.child_set.all()) 
     return ','.join([child.name for child in children]) 

Utilisation de la méthode dehygrate(). Ensuite, lorsque vous exportez ParentResource, vous obtenez un objet dataset avec une clé "children" dont la valeur est une liste séparée par des virgules des noms de ses enfants.