2015-06-11 44 views
0

在我的模型,我有以下方法:Django列表理解 - 比較日期時間對象的問題。類型錯誤:unorderable類型:datetime.date()<= STR()

def _bags_remaining(self): 
    current_set = SortingRecords.objects.values().filter(~Q(id=self.id), tag=self.tag) 
    sorted = [SortingRecords['bags_sorted'] for SortingRecords in current_set if 
       SortingRecords['date'] <= self.date] 
    remaining = self.tag.pieces - sum(sorted) - self.bags_sorted 
    return remaining 
bags_remaining = property(_bags_remaining) 

它旨在發現,迄今已在分揀的行李數量。與記錄關聯的標籤,並從總包中扣除該金額(以及在該記錄下排序的金額)。

它很好用!適當的數量已成功傳遞給模板。

但是,我很沮喪,它扔掉了我的單元測試。

====================================================================== 
ERROR: test_sorting_records_bags_remaining_calculation (AlmondKing.InventoryLogs.tests.test_views.test_purchase_details.DetailsPageTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "C:\Projects\AlmondKing\AlmondKing\InventoryLogs\tests\test_views\test_purchase_details.py", line 155, in test_sorting_records_bags_remaining_calculation 
    self.assertEqual(self.sortrecord1.bags_remaining, 79) 
    File "C:\Projects\AlmondKing\AlmondKing\InventoryLogs\models.py", line 115, in _bags_remaining 
    sorted = [SortingRecords['bags_sorted'] for SortingRecords in current_set if 
    File "C:\Projects\AlmondKing\AlmondKing\InventoryLogs\models.py", line 116, in <listcomp> 
    SortingRecords['date'] <= self.date] 
TypeError: unorderable types: datetime.date() <= str() 

---------------------------------------------------------------------- 
Ran 22 tests in 0.203s 

FAILED (errors=2) 
Destroying test database for alias 'default'... 

它似乎將我的日期對象解釋爲一個字符串。它繪製的模型是一個DateField。如果我呼叫類型上它報告爲:

在此處,它被安置模式:

class SortingRecords(models.Model): 
    tag = models.ForeignKey(Purchase, related_name='sorting_record') 
    date = models.DateField() 
    bags_sorted = models.IntegerField() 
    turnout = models.IntegerField() 
    objects = models.Manager() 

    def __str__(self): 
     return "%s [%s]" % (self.date, self.tag.tag) 

這是我運行測試。

# Sorting Records should calculate bags remaining for each entry. 
def test_sorting_records_bags_remaining_calculation(self): 
    self.assertEqual(self.sortrecord1.bags_remaining, 79) 
    self.assertEqual(self.sortrecord2.bags_remaining, 39) 
    self.assertEqual(self.sortrecord3.bags_remaining, 9) 

同樣,它在現實生活中有效,但在運行測試時失敗。任何想法爲什麼?

編輯補充細節:使用

數據庫是Postgres的。

這裏是我的測試setUpTestData():

class DetailsPageTest(TestCase): 


@classmethod 
def setUpTestData(cls): 

    cls.product1 = ProductGroup.objects.create(
         product_name="Almonds" 
         ) 
    cls.variety1 = Variety.objects.create(
         product_group = cls.product1, 
         variety_name = "non pareil", 
         husked = False, 
         finished = False, 
         ) 

    cls.supplier1 = Supplier.objects.create(
         company_name = "Acme", 
         company_location = "Acme Acres", 
         contact_info = "Call me!" 
         ) 

    cls.shipment1 = Purchase.objects.create(
         tag=9, 
         shipment_id=9999, 
         supplier_id = cls.supplier1, 
         purchase_date='2015-01-09', 
         purchase_price=9.99, 
         product_name=cls.variety1, 
         pieces=99, 
         kgs=999, 
         crackout_estimate=99.9 
         ) 
    cls.shipment2 = Purchase.objects.create(
         tag=8, 
         shipment_id=8888, 
         supplier_id=cls.supplier1, 
         purchase_date='2015-01-08', 
         purchase_price=8.88, 
         product_name=cls.variety1, 
         pieces=88, 
         kgs=888, 
         crackout_estimate=88.8 
         ) 
    cls.shipment3 = Purchase.objects.create(
         tag=7, 
         shipment_id=7777, 
         supplier_id=cls.supplier1, 
         purchase_date='2014-01-07', 
         purchase_price=7.77, 
         product_name=cls.variety1, 
         pieces=77, 
         kgs=777, 
         crackout_estimate=77.7 
         ) 

    cls.sortrecord1 = SortingRecords.objects.create(
         tag=cls.shipment1, 
         date="2015-02-05", 
         bags_sorted=20, 
         turnout=199, 
         ) 

    cls.sortrecord2 = SortingRecords.objects.create(
         tag=cls.shipment1, 
         date="2015-02-07", 
         bags_sorted=40, 
         turnout=399, 
         ) 
    cls.sortrecord3 = SortingRecords.objects.create(
         tag=cls.shipment1, 
         date='2015-02-09', 
         bags_sorted=30, 
         turnout=299, 
         ) 
+1

兩種可能的罪魁禍首:你的測試用例的'設置()'(你沒有張貼),你的測試數據庫(沒有指定) - 或最有可能兩者之間的相互作用。請注意,SQLite將everyting存儲爲字符串,並且在涉及日期時可能會有點不可預測... –

+0

謝謝。我已經用細節更新了問題。如你所見,將日期作爲字符串輸入。這一定是罪魁禍首。 –

回答

0

感謝@bruno desthuilliers我觀察到的問題。

我的setUpTestData()方法是用字符串而不是日期時間對象填充字段。它的工作原理把它們轉換成適當的輸入正確後:

purchase_date=datetime.date(2015,1,9) 
相關問題