From 2906806abd884499c91fc32dde3c3da463dc8838 Mon Sep 17 00:00:00 2001 From: Safe Hammad Date: Fri, 7 Aug 2015 07:52:43 +0100 Subject: [PATCH] Span OneToOneField relationship using double underscores. --- django_pandas/io.py | 2 +- django_pandas/tests/models.py | 14 ++++++++++++-- django_pandas/tests/test_io.py | 28 ++++++++++++++++++---------- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/django_pandas/io.py b/django_pandas/io.py index 776453a..cc4063d 100644 --- a/django_pandas/io.py +++ b/django_pandas/io.py @@ -8,7 +8,7 @@ def to_fields(qs, fieldnames): model = qs.model for fieldname_part in fieldname.split('__'): field = model._meta.get_field(fieldname_part) - if field.get_internal_type() == 'ForeignKey': + if field.get_internal_type() in ('ForeignKey', 'OneToOneField'): model = field.rel.to yield field diff --git a/django_pandas/tests/models.py b/django_pandas/tests/models.py index c3897de..26bee71 100644 --- a/django_pandas/tests/models.py +++ b/django_pandas/tests/models.py @@ -122,6 +122,14 @@ def __str__(self): return "{0}-{1}".format(self.isin, self.symbol) +@python_2_unicode_compatible +class TradeLogNote(models.Model): + note = models.TextField() + + def __str__(self): + return self.note + + @python_2_unicode_compatible class TradeLog(models.Model): trader = models.ForeignKey(Trader) @@ -129,14 +137,16 @@ class TradeLog(models.Model): log_datetime = models.DateTimeField() price = models.FloatField() volume = models.IntegerField() + note = models.OneToOneField(TradeLogNote) objects = DataFrameManager() def __str__(self): - return "{0}-{1}-{2}-{3}-{4}".format( + return "{0}-{1}-{2}-{3}-{4}-{5}".format( self.trader, self.symbol, self.log_datetime, self.price, - self.volume + self.volume, + self.note ) diff --git a/django_pandas/tests/test_io.py b/django_pandas/tests/test_io.py index a4e7759..3348218 100644 --- a/django_pandas/tests/test_io.py +++ b/django_pandas/tests/test_io.py @@ -2,7 +2,7 @@ from django.db.models import Sum import pandas as pd import numpy as np -from .models import MyModel, Trader, Security, TradeLog, MyModelChoice +from .models import MyModel, Trader, Security, TradeLog, TradeLogNote, MyModelChoice from django_pandas.io import read_frame @@ -85,28 +85,36 @@ def setUp(self): zyz = Security.objects.create(symbol='ZYZ', isin='999907') TradeLog.objects.create(trader=bob, symbol=None, log_datetime='2013-01-01T09:30:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aaa')) TradeLog.objects.create(trader=bob, symbol=None, log_datetime='2013-01-01T10:00:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aab')) TradeLog.objects.create(trader=bob, symbol=abc, log_datetime='2013-01-01T10:30:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aac')) TradeLog.objects.create(trader=bob, symbol=abc, log_datetime='2013-01-01T11:00:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aad')) TradeLog.objects.create(trader=fish, symbol=zyz, log_datetime='2013-01-01T09:30:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aae')) TradeLog.objects.create(trader=fish, symbol=zyz, log_datetime='2013-01-01T10:00:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aaf')) TradeLog.objects.create(trader=fish, symbol=zyz, log_datetime='2013-01-01T10:30:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aag')) TradeLog.objects.create(trader=fish, symbol=zyz, log_datetime='2013-01-01T11:00:00', - price=30, volume=300) + price=30, volume=300, + note=TradeLogNote.objects.create(note='aah')) def test_verbose(self): qs = TradeLog.objects.all() @@ -124,7 +132,7 @@ def test_verbose(self): def test_related_cols(self): qs = TradeLog.objects.all() cols = ['log_datetime', 'symbol', 'symbol__isin', 'trader__name', - 'price', 'volume'] + 'price', 'volume', 'note__note'] df = read_frame(qs, cols, verbose=False) self.assertEqual(df.shape, (qs.count(), len(cols)))