Django不调用模型清理方法

发布于 2021-01-29 15:27:46

我有一个视图,该视图从CSV文件创建模型。我已经向模型类定义添加了clean方法,但是在创建模型时不会调用它。

这是models.py的示例:

class Run(models.Model):
    name = models.CharField(max_length=120)
    tested_build = models.ForeignKey('apps.Build')
    timestamp_start = models.DateTimeField()
    timestamp_end = models.DateTimeField()

class CommonMeasurement(models.Model):
    timestamp = models.DateTimeField()
    value = models.FloatField()
    run = models.ForeignKey(Run)

    def clean(self):
        super(CommonMeasurement, self).clean()
        print 'here we go'
        if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
            raise django_excetions.ValidationError('Measurement is outside the run')


class ClientMeasurement(CommonMeasurement):
    metric = models.ForeignKey(ClientMetric)
    account = models.CharField(max_length=120, blank=True)

这是我的Form View代码示例:

class BaseMeasurementsUpload(generic_views.FormView):
    template_name = 'upload.html'
    models_to_upload = None

    def get_success_url(self):
        return self.request.get_full_path()

    def form_valid(self, form):
        uploader = getattr(importers, form.cleaned_data['uploader'])
        try:
            the_uploader = uploader(form.cleaned_data, self.models_to_upload)
            upload_results = the_uploader.get_result_info()
        except django_exceptions.ValidationError as e:
            custom_errors = e
        return render_to_response(self.template_name,
                                  {'upload_results': upload_results,
                                   'custom_errors': custom_errors},
                                  context_instance=RequestContext(self.request))


class ClientMeasurementsUploadView(BaseMeasurementsUpload):
    form_class = forms.ClientMeasurementsUploadForm
    models_to_upload = models.ClientMeasurement

    def get_form(self, form_class):
        uploaders = (('MeasurementsSimpleCsv', importers.MeasurementsSimpleCsv.__doc__),
                     ('ClientMeasurementsBulkCsv', importers.ClientMeasurementsBulkCsv.__doc__,))
        if self.request.POST:
            # get bound form
            return self.form_class(uploaders,
                                   self.request.POST,
                                   self.request.FILES)
        else:
            return forms.ClientMeasurementsUploadForm(uploaders)

进口商执行实际验证并为每个模型调用create方法。

关注者
0
被浏览
240
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我找到了覆盖方法的解决方案:

    class CommonMeasurement(models.Model):
        timestamp = models.DateTimeField()
        value = models.FloatField()
        run = models.ForeignKey(Run)
    
        objects = models.Manager()
        analyzes = managers.MeasureStatManager()
    
        def save(self, **kwargs):
            self.clean()
            return super(CommonMeasurement, self).save(**kwargs)
    
        def clean(self):
            super(CommonMeasurement, self).clean()
            print 'here we go'
            if self.timestamp < self.run.timestamp_start or self.timestamp > self.run.timestamp_end:
                raise django_excetions.ValidationError('Measurement is outside the run')
    

    但是我不确定这是否是一个好决定。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看