2010-05-18 49 views
30

Tôi đang làm việc trên một tracker thể dục nhỏ để dạy cho bản thân mình Django. Tôi muốn vẽ đồ thị trọng lượng của mình theo thời gian, vì vậy tôi đã quyết định sử dụng Trình bao bọc biểu đồ Google Python. Biểu đồ Google yêu cầu bạn chuyển đổi ngày của mình thành một tọa độ x. Để thực hiện điều này, tôi muốn lấy số ngày trong tập dữ liệu của mình bằng cách trừ lần cân đầu tiên từ lần cân cuối cùng và sau đó sử dụng để tìm ra các co x (ví dụ, tôi có thể 100 theo kết quả và tăng x điều phối theo số kết quả cho mỗi điều phối y.)Làm cách nào để trừ hai ngày trong Django/Python?

Dù sao, tôi cần tìm ra cách trừ các đối tượng datango Django từ một đối tượng khác và cho đến giờ, tôi nổi bật trên cả google và ở đây tại ngăn xếp. Tôi biết PHP, nhưng chưa bao giờ có được một xử lý về lập trình OO, vì vậy hãy tha thứ cho sự thiếu hiểu biết của tôi. Đây là những gì các mô hình của tôi trông giống như:

class Goal(models.Model): 
    goal_weight = models.DecimalField("Goal Weight", 
     max_digits=4, 
     decimal_places=1) 
    target_date = models.DateTimeField("Target Date to Reach Goal") 
    set_date = models.DateTimeField("When did you set your goal?") 
    comments = models.TextField(blank=True) 

    def __unicode__(self): 
     return unicode(self.goal_weight) 

class Weight(models.Model): 
    """ Weight at a given date and time. """ 

    goal = models.ForeignKey(Goal) 
    weight = models.DecimalField("Current Weight", 
     max_digits=4, 
     decimal_places=1) 
    weigh_date = models.DateTimeField("Date of Weigh-In") 
    comments = models.TextField(blank=True) 

    def __unicode__(self): 
     return unicode(self.weight) 

    def recorded_today(self): 
     return self.date.date() == datetime.date.today() 

Bất kỳ ý tưởng nào về cách tiến hành trong chế độ xem? Cám ơn rất nhiều!

Trả lời

54

Bạn chỉ có thể trừ đi số ngày trực tiếp, mà sẽ mang lại một đối tượng datetime.timedelta:

dt = weight_now.weight_date - weight_then.weight_date 

Một đối tượng timedelta có các trường trong nhiều ngày, giây và micro giây. Từ đó, bạn chỉ có thể làm toán thích hợp. Ví dụ:

hours = dt.seconds/60/60 # Returns number of hours between dates 
weeks = dt.days/7    # number of weeks between dates 
+0

Tuyệt vời, cảm ơn rất nhiều. Sử dụng gần như nguyên văn này. –

31

Django datetime đối tượng chỉ là thường xuyên Python datetime objects. Khi bạn trừ một số datetime từ một số khác, bạn sẽ nhận được đối tượng timedelta.

Nếu bạn đang tìm cách trừ một khoảng thời gian từ datetime, bạn cần phải trừ một đối tượng timedelta khỏi nó. Ví dụ:

>>> from datetime import datetime, timedelta 
>>> now = datetime.now() 
>>> print now 
2010-05-18 23:16:24.770533 
>>> this_time_yesterday = now - timedelta(hours=24) 
>>> print this_time_yesterday 
2010-05-17 23:16:24.770533 
>>> (now - this_time_yesterday).days 
1 
+0

Điều này thật tuyệt. Cảm ơn rất nhiều ... Tôi quá quen với việc suy nghĩ bằng dây, tôi không nghĩ rằng có thể tạo ra đối tượng bằng cách trừ đi hai vật thể khác. –

3

Lưu ý rằng trừ sẽ không hoạt động trong trường hợp hai ngày có nhận thức bù đắp khác nhau, ví dụ: một lần có tzinfo và một không có (gốc).

+0

đây không phải là câu trả lời cho câu hỏi. để lại nhận xét về câu trả lời khác nếu bạn có gì đó để thêm vào những gì đã được nói – FistOfFury

Các vấn đề liên quan