Django日期时间比较在保存

时间:2018-02-17 18:39:46

标签: python django datetime django-models

我的一个模型中有一个自定义保存例程,用于比较datetime个字段,然后应该修改另一个模型上的字段并根据结果保存。但是,这种比较并没有像我期望的那样有效。也就是说,无论实际比较如何,我的<=比较都会返回True

models.py

class Session(models.Model):
    date = models.DateField()
    # etc...

class Case(models.Model):
    summary = models.TextField(blank=True)
    session = models.ForeignKey(Session, on_delete=models.CASCADE, related_name='cases')
    case_type = models.ForeignKey(CaseType)
    # etc...

class Person(models.Model):
    earliest_case = models.ForeignKey('Case', null=True, blank=True, related_name='person_to_earliest_case+')
    latest_case = models.ForeignKey('Case', null=True, blank=True, related_name='person_to_latest_case+')
    # etc...


class Litigant(models.Model):

    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name='person_to_case')
    case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='case_to_person')
    # etc...

    def save(self, *args, **kwargs):
         try:
             person = Person.objects.get(id=self.person_id)
             earliest_case = person.earliest_case
             latest_case = person.latest_case
             if self.case.session.date <= earliest_case.session.date:
                  person.earliest_case = self.case
                  person.save()
             elif self.case.session.date >= latest_case.session.date:
                  person.earliest_case = self.case
                  person.save()
         except:
             pass
         super(Litigant, self).save(*args, **kwargs)

正如您所看到的,当我保存新的Litigant时,我想要它要做的就是调用现有的Person实例,比较该实例的earliest_case条目{1}}和latest_caseCase个实例绑定到Litigant,然后根据需要重新分配字段。

相反的是,新的case被添加到person.earliest_case ,无论是否早于或晚于现有日期,我就是不太确定为什么。

供参考,Session日期字段中存储的日期均为Year-Date-Month

令人沮丧的是,如果我在shell中调用了case.session.date的两个实例,那么它们就比较好了。

如果重要的话,case fk会被添加到我的视图中,如下所示:

views.py

def add_litigant(request, pk):
     case_instance = get_object_or_404(models.Case, pk=pk)
     if request.method == "POST":
         form = forms.LitigantForm(request.POST)
         if form.is_valid():
             new_litigant = form.save(commit=False)
             new_litigant.case = case_instance
             new_litigant.save()
     # etc...

# def edit_litigant works the same way

我将不胜感激任何指导或指示。提前谢谢!

1 个答案:

答案 0 :(得分:2)

  

相反的是,新案例被添加到person.earliest_case,无论它是早于还是晚于现有日期,我都不确定原因。

这就是原因:

if self.case.session.date <= earliest_case.session.date:
    person.earliest_case = self.case  # <- assigned to earliest_case
    person.save()
elif self.case.session.date >= latest_case.session.date:
    person.earliest_case = self.case   # <- assigned to earliest_case. COPYPASTA!
    person.save()