Django F似乎不起作用?

时间:2016-06-26 01:19:04

标签: python django django-models

嗯,由于某些原因,即使在最简单的模型上,我也似乎无法让F正常工作。这里是关于Django 1.9.x。

以最简单的形式,TestAccount

public int theTimeMachineHours(EditText a, EditText b) throws Exception{
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
    Date startDate = simpleDateFormat.parse(a.getText().toString());
    Date endDate = simpleDateFormat.parse(b.getText().toString());

    long difference = endDate.getTime() - startDate.getTime();
    if(difference<0)
    {
        Date dateMax = simpleDateFormat.parse("24:00");
        Date dateMin = simpleDateFormat.parse("00:00");
        difference=(dateMax.getTime() -startDate.getTime() )+(endDate.getTime()-dateMin.getTime());
    }
    int days = (int) (difference / (1000*60*60*24));
    int hours = (int) ((difference - (1000*60*60*24*days)) / (1000*60*60));
    int min = (int) (difference - (1000*60*60*24*days) - (1000*60*60*hours)) / (1000*60);

    return hours;
}

但根据这个:https://docs.djangoproject.com/en/1.9/ref/models/instances/#updating-attributes-based-on-existing-fields它应该有用......

为什么F不被排除在验证之外我不知道。它应该是,Django应该只创建一个查询来更新它。

1 个答案:

答案 0 :(得分:5)

这在纯Django中运行良好。在您的情况下,问题是您有helium.internal.signals的监听器(pre_save)尝试执行此操作:

def validate_model(sender, **kwargs):
    if 'raw' in kwargs and not kwargs['raw']:
        kwargs['instance'].full_clean()

Model.full_clean期望模型中每个字段都有一堆值,但在这种情况下,您的某个字段不是值,而是CombinedExpression尚未评估的字段,并且只会当Django写入数据库时​​得到评估。这会导致错误。

IMO您需要执行自己的验证,实现full_clean的逻辑并处理Expression,或者您需要从full_clean中排除包含表达式的字段。