2015-10-01 4 views
2

J'ai une application de réservation de chambre avec un modèle de réservation qui a une relation ForeignKey simple avec mon modèle de chambre. Voici une idée super brève de ce que je fais face à:Dénormaliser les relations avec django-import-export

class Room(..): 
    floor = models.IntegerField() 
    number = models.IntegerField() 
    ... 

class Booking(..): 
    room = models.ForeignKey('Room') 
    ... 

Je me sers de django-import-export sur le modèle de réservation pour permettre à l'administrateur d'effectuer des sauvegardes de ces données d'une manière qu'ils peuvent importer dans Excel. Cela a été très utile pour leur donner rapidement des données à la demande sans leur coûter du temps.

Mon problème est que la relation de la pièce est ignorée; il pompe le room_id au lieu de suivre la relation. Je comprends que cela a du sens pour l'importation de données, mais pour toutes les applications pratiques, le primary_key de la salle est complètement inutile. Les personnes qui consultent les données de réservation doivent savoir quel est l'étage et le numéro de chambre.

Existe-t-il un moyen simple d'ajouter des données supplémentaires aux données de django-import-export pour dénormaliser ces champs?

Répondre

3

Voir Getting started dans la documentation.

Lors de la définition des champs de modelResource il est possible de suivre les relations du modèle:

class BookResource(resources.ModelResource): 

    class Meta: 
     model = Book 
     fields = ('author__name',) 

Dans vos champs de cas serait ('room__floor', 'room__number',)

0

En fait, ce n'est pas si douloureux! Nous avons besoin de surcharger quelques fonctions ImportExportModelAdmin sur notre ModelAdmin pour ajouter les données supplémentaires à la requête, puis le faire passer.

class BookingAdmin(ImportExportModelAdmin): 
    ... 

    def get_resource_class(self): 
     from import_export.fields import Field 
     rc = super(BookingAdmin, self).get_resource_class() 
     for f in ('room_floor', 'room_number'): 
      rc.fields[f] = Field(f, f, readonly=True) 
     return rc 

    def get_export_queryset(self, request): 
     rs = super(BookingAdmin, self).get_export_queryset(request) 
     return rs.annotate(
      room_floor=F('room__floor'), 
      room_number=F('room__number') 
     ) 

Aucune idée de ce qui se passe lors de l'importation. J'ai mis les champs à readonly de sorte qu'ils devraient être ignorés. Heureusement, nous avons dépassé le point où importer importe.