2016-07-01 4 views
1

Ich versuche ein Modul zu finden/zu erstellen, das den Massen-Upload von Daten nach Django ermöglicht. Ich versuche, viele Künstler mit einem bestimmten Festival zu verbinden, aber alle Module, die ich bisher gefunden habe, unterstützen nur das 1: 1 Hochladen. https://github.com/edcrewe/django-csvimportKann ich eine Bulk-Datei mit vielen Beziehungen in eine Django-Datei hochladen?

+0

Ja, Sie können. Sie müssen dafür benutzerdefinierten Code schreiben. Ich habe das für ein E-Commerce-Projekt getan. – xyres

+0

haben es geschafft. Gibt es eine Chance, dass du deine Inspirationen teilen kannst? –

+0

Posted ein Beispiel dafür unten. – xyres

Antwort

1

Hier ist ein Beispiel, was Sie tun möchten. Ich habe den ursprünglichen Code entfernt, da er zu groß war. Aber das würde Ihnen immer noch einen guten Ausgangspunkt geben.

In Wirklichkeit waren die CSV-Dateien, die vom Client hochgeladen wurden, nicht so einfach, wie ich im Beispiel gezeigt habe. Einige Zeilen waren leer, einige Zeilen enthielten einige andere unnötige Informationen wie Name der Software, die die Datei erzeugte, Name des Speichers usw. Also musste ich einige weitere Methoden schreiben, um diese Daten herauszufiltern. Aber ich habe das unten nicht getan. Ich habe das Beispiel so minimal wie möglich gehalten.

from django.db import models 
import csv 


class Category(models.Model): 
    name = models.CharField(max_length=10) 


class Product(models.Model): 
    category = models.ForeignKey(Category) 
    uid = models.CharField(max_length=4) 
    name = models.CharField(max_length=10) 
    price = models.IntegerField() 
    qty = models.IntegerField() # quantity 


class CSVFile(models.Model): 
    """ 
    This model allows for uploading a CSV file and then 
    updates data in Category and Product models 
    """ 
    csv_file = models.FileField(upload_to='csvfiles') 
    # feel free to add other fields like upload date, etc. 

    def save(self, *args, **kwargs): 
     """ 
     This is where you analyze the CSV file and update 
     Category and Product models' data 
     """ 
     super(CSVFile, self).save(*args, **kwargs) 
     self.csv_file.open(mode='rb') 
     f = csv.reader(self.csv_file) 
     for row in f: 
      # currently the row is a list of all fields in CSV file 
      # change it to a dict for ease 
      row_dict = self.row_to_dict(row) # this method is defined below 
      # check if product exists in db 
      product = self.product_is_in_db(row_dict['uid']) # this method is defined below 
      if product: 
       # product is in db 
       # update fields values 
       self.update_product(product, row_dict) # this method is defined below 
      else: 
       # product is not in db 
       # create this product 
       self.create_product(row_dict) # this method is defined below 

     self.csv_file.close() 


    def row_to_dict(self, row): 
     """Returns the given row in a dict format""" 
     # Here's how the row list looks like: 
     # ['category', 'product name', 'product uid' 'price', 'qty'] 
     return {'category': row[0], 'name': row[1], 
      'uid': row[2], 'price': row[3], 'qty': row[4] 
      } 

    def product_is_in_db(self, uid): 
     """Check the product is in db. 
     If yes, return the product, else return None 
     """ 
     try: 
      return Product.objects.get(uid=uid) 
     except Product.DoesNotExist: 
      return None 

    def update_product(self, product, row_dict): 
     """Update the given product with new data in row_dict""" 
     product.price = row_dict['price'] 
     product.qty = row_dict['qty'] 
     product.save() 

    def create_product(self, row_dict): 
     # First see, if category exists 
     # If not, create a new category 
     try: 
      category = Category.objects.get(row_dict['category']) 
     except Category.DoesNotExist: 
      category = Category.objects.create(name=row_dict['category']) 

     # Now, create the product 
     Product.objects.create(
      name=row_dict['name'], 
      uid=row_dict['uid'], 
      price=row_dict['price'], 
      qty=row_dict['qty'], 
      category=category, 
     ) 
+1

Ich verwende gerne ['csv.DictReader'] (https://docs.python.org/2/library/csv.html#csv.DictReader), um den Code für Iteration und Parsing zu reduzieren. – tutuDajuju

+1

@tutuDajjuju Ja, ich stimme zu, dass es ein besserer Weg ist. Aber in der ursprünglichen Anwendung, von der ich diesen Code abgeleitet habe, waren die Zeilen in CSV-Dateien inkonsistent. Einige Zeilen enthielten unerwünschte Daten. Also musste ich die Zeilen manuell in dict umwandeln. Aber um dieses Beispiels willen hätte ich 'csv.DictReader' einfach benutzen sollen. – xyres