Lesson 31 - Import/Export
LEARN
Course Content
Today
- Export Design Pattern
- Import Design Pattern
Design Patterns
- Capture design decisions for next time
- Reuse design choices
- Custom choices and limitations
- When to apply pattern
- Say it in code
Reusable Design Patterns
- CRUD Operations
- CRUD Test
- Data Views
- Data Views Test
- Import/Export
- Code Cloner
Export Design Pattern
- List all records
- Create a spreadsheet file (CSV)
Writing CSV File
table/table.py
```python from csv import writer
def write_csv_file(path, table): with open(path, 'w', newline='') as f: writer(f).writerows(table) ```
Data Model Export Method
book/models.py
```python class Chapter(models.Model): book = models.ForeignKey(Book, on_delete=models.CASCADE, editable=False) order = models.IntegerField() title = models.CharField(max_length=200)
def export_record(self):
return [self.order, self.title]
```
Exporting Objects
book/book.py
python
def export_chapters(book):
model = Chapter
chapters = f'{book.doc_path}/chapters.csv'
records = [o.export_record() for o in model.objects.filter(book=book.title)]
write_csv_file(chapters, records)
Import Design Pattern
- Bring data in from a spreadsheet
- For each row create an object
- Read document files
Reading a Table
table/table.py
```python from csv import reader
def read_csv_file(path): with open(path) as f: return [row for row in reader(f)] ```
Data Model Import Method
book/models.py
```python class Chapter(models.Model): book = models.ForeignKey(Book, on_delete=models.CASCADE, editable=False) order = models.IntegerField() title = models.CharField(max_length=200)
@staticmethod
def import_record(book, values):
c = Chapter.objects.get_or_create(book=book, order=values[0])[0]
c.title = values[1]
c.document = values[2]
c.save()
```
Importing Objects
book/book.py
python
def import_chapters(book):
model = Chapter
chapters = f'{book.doc_path}/chapters.csv'
for row in read_csv_file(chapters):
model.import_record(book, row)
Tests
book/tests_book.py
```python class BookDataTest(TestCase):
def test_import_poems(self):
import_poems_book()
self.assertEqual(len(Author.objects.all()), 1)
self.assertEqual(len(Book.objects.all()), 1)
self.assertEqual(len(Chapter.objects.all()), 56)
```
BUILD
Demo Code
- Demo Code
- Follow along with my source code
- Clone my repo and edit the code
Final Project
- Due on December 3
- Requirements for Projects 10, 11, 12, 13, 14
- Partial Credit will be given